片段与活动之间的沟通流程

时间:2013-04-04 19:22:36

标签: android android-fragments

我正在尝试制作一个简单的提醒应用。创建新提醒时,我有以下设置:

  1. MainEditActivity.java :以下片段的2个占位符FrameLayouts:
    • EditNameFragment.java
      • 自定义操作栏(取消,确定按钮)
      • 提醒名称的EditText
      • CheckBox切换以下片段之一
    • EditDateFragment.java OR EditLocationFragment.java (两者都有很多观点)
  2. 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个MainActivity和所有元素以及ViewFlipper。然后我读到片段最好最终适应平板电脑更好。这是解决这个问题的正确方法吗?

    2. 问题:我知道如何从 EditNameFragment.java 获取数据。但是如何从 EditDataFragment EditLocationFragment 中获取用户输入的数据? 我是否需要MainActivity中的这两个片段的实例来访问他们的视图?或者我是否需要像使用EventHandler那样的其他回调?如果是,那么规则是对每个片段进行回调吗?

    3. 我想我正在努力解决这些组件之间的通信流程。我知道片段到片段的通信不是一个好的设计

1 个答案:

答案 0 :(得分:0)

  1. 碎片是独立的模块化组件,如果它们彼此独立地呈现则是有意义的。规范的例子是报纸文章列表和文章的显示......两者都可以单独或单独呈现,这是有意义的。在你的情况下,我认为有多个片段可能是不必要的,因为它们没有独立于另一个有意义(或者你最终会得到一个半定义的事件)。好像你有一个片段来编辑日期和一个片段来编辑名称,但从概念上讲,这两个片段确实编辑了一个“对象”,即事件。因此,这可能应该使用ViewFlipper在一个片段内完成。

  2. 你见过这个吗?

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

    您需要主活动中所有三个片段的实例,并且您需要为每个片段定义接口并在主活动中实现它们。