2013-04-04 72 views
1

我在试图制作一个简单的提醒应用程序。当创建一个新的提醒,我有以下设置:片段与活动之间的通信流程

  1. MainEditActivity.java:2占位FrameLayouts以下片段:
    • EditNameFragment.java
      • 自定义操作栏(取消, OK按钮)
      • 提醒名称的EditText
      • CheckBox切换下列其中一个片段
    • EditDateFragment.javaOREditLocationFragment.java(两者有很多的意见)

MainEditActivity.java:

private LocationFragment mLocationFragment; 
    private DateFragment mDateFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

      setContentView(R.layout.activity_new_remainer_main); // 2 frame layouts 
      if (savedInstanceState == null) { 
      Fragment newFragment = new NewReminderFragment(); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      ft.add(R.id.reminder_title_fragment, newFragment).commit(); 

      mDateFragment = new DateFragment(); 
      ft = getFragmentManager().beginTransaction(); 
      ft.add(R.id.date_or_location_fragment, mDateFragment).commit(); 
     } 
    } 

    public void onCheckBoxClick(View view) 
    { 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     if(mLocationFragment == null) 
     mLocationFragment = new LocationFragment(); 

     CheckBox checkBox = (CheckBox)findViewById(R.id.checkBoxID); 
     if(checkBox != null) 
     { 
     if(checkBox.isChecked()) { 
      fragmentTransaction.replace(R.id.date_or_location_fragment, mLocationFragment); 
     } else { 
      fragmentTransaction.replace(R.id.date_or_location_fragment, mDateFragment); 
     } 
     fragmentTransaction.commit(); 
    } 

    @Override 
    public void handleEvent(EventInfo event) { 
      // here I get all the data (name, data, time, location, etc) 
    } 

EditNameFragment.java:

private EventHandler mEventHandler; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     mEventHandler = (EventHandler)activity; 
    } 

    View doneButton = actionBarButtons.findViewById(R.id.doneBtnTextID); 
    doneButton.setOnClickListener(new View.OnClickListener() {  
     @Override 
     public void onClick(View v) { 
      createNewReminder();    
     } 
    }); 

    private void createNewReminder() 
    { 
     // Event info object to store all information (reminder name, data, time, etc) 
     EventInfo eventInfo = new EventInfo(); 
     // access either Date or Location Fragment (depending on which is visible) 
     // FIXME: access the fragments and get the data 
     // let the activity know to display the new reminder 
     mEventHandler.handleEvent(eventInfo); 
    } 
  1. 问:我开始只使用1与所有元素和ViewFlipper MainActivity。然后我看到片段更适合最终适应平板电脑。这是解决这个问题的正确方法吗?

  2. 问题:我知道如何从获取数据EditNameFragment.java。但是,如何获取用户从EditDataFragmentEditLocationFragment输入的数据? 我需要MainActivity中这两个片段的实例来访问它们的视图吗?还是需要像我在EventHandler上那样进行另一个回调?如果是的话,规则是要为每个片段进行回调?

我想我挣扎了一下这些组件之间的通信流。我知道片段到片段通信不是一个好的设计

回答

0
  1. 片段是独立的,模块化的组件,如果它们自己独立提出,将是有意义的。规范的例子是报纸文章的列表和文章的展示......既可以独立展示,也可以单独展示,这是有道理的。在你的情况下,我认为有多个片段可能是不必要的,因为它们没有意义独立于其他(或者你最终会得到一个半定义的事件)。看起来好像你有一个片段来编辑日期和一个片段来编辑名称,但从概念上来说,这两个片段确实编辑了一个“对象”,这是事件。因此,这可能应该使用ViewFlipper在一个片段内完成。

  2. 你见过这个吗?

http://developer.android.com/training/basics/fragments/communicating.html

您需要在主活动的所有三个片段的情况下,你需要定义接口的每个片段,并在主要活动实现它们。

+0

是的,这是有道理的。所以我首先做出了正确的决定,只使用了1个活动和一个ViewFlipper。至少我现在知道下一次我需要每个片段的回调接口。谢谢! – user2246120 2013-04-04 20:33:34