如何在Android中的多个片段之间传递数据

时间:2015-06-11 04:37:26

标签: android android-tabhost android-listfragment android-dialogfragment dialogfragment

在我的主Activity中,我有一个包含FragmentTabHost的DialogFragment。我有两个选项卡,一个是DialogFragment,另一个是ListFragment。什么时候可以' OK'在内部DialogFragment中按下按钮,或者当按下ListFragment中的元素时,我想传递两个字符串(在内部DialogFragment中的两个TextView中输入并显示在ListFragment中的每个元素中)返回活动,但我不确定如何使用多个级别的碎片。

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

没有魔力。

您可以通过两种方法实现。

  1. 使用回调。
  2. 创建接口和类以将数据通过子Fragment传递给Activity。你不需要修改桥接TabHostFragment,因为无论有多少片段包裹片段,Fragment总是依赖于它的母语Context(Activity)。

    public class TwoStrings {
        public TwoStrings(String one, String two){
            this.one = one;
            this.two = two;
        }
        public String one;
        public String two;
    }
    

    首先,声明接口。

    public interface DataPassListener {
        void dataPassed(TwoStrings data);
    }
    

    并在Activity中实现接口。

    public class MainActivity extends Activity implements DataPassListener {
        @Override
        public void dataPassed(TwoStrings data) {
            // do something with data.
            Log.d("string one", data.one);
            Log.d("string two", data.two);
        }
    }
    

    最后,让child Fragment确认母亲Activity有回调监听器。

    public class DialogFragment1 extends DialogFragment {
        DataPassListener listener;
    
        @Override
        public void onAttach(Activity activity) {
            if (activity instanceOf DataPassListener)
                listener = (DataPassListener) activity;
        }
    
        public void setDataPassListener(DataPassListener listener){
            listener = ((DataPassListener) listener);
        }    
    
        public void doSomeThing(){
            if(listener != null) // important to prevent NullPointerException
                listener.dataPassed("a", "b");
        }
    }
    
    1. 使用EventBus。
    2. 我更喜欢使用Otto来发布和订阅数据。

      订阅活动中的收听事件,

      public class MainActivity extends Activity {
      
          @Override
          public void onResume() {
              super.onResume();
              BusProvider.getInstance().register(this);
          }
      
          @Override
          public void onPause() {
              super.onPause();
              BusProvider.getInstance().unregister(this);
          }
      
          @Subscribe
          public void onUpdateTwoStrings(TwoStrings event) {
              // do something with data.
              Log.d("string one", data.one);
              Log.d("string two", data.two);
          }
      }
      

      并且,在Fragment的任何地方发布活动。

      bus.post(new TwoStrings("a", "b"));
      

答案 1 :(得分:1)

查看setTargetFragment()getTargetFragment()方法。您可以通过它连接片段,而无需任何额外的回调和库。