【问题标题】:How to pass data between multiple Fragments in Android如何在Android中的多个Fragment之间传递数据
【发布时间】:2015-06-11 04:37:26
【问题描述】:

在我的主要活动中,我有一个包含 FragmentTabHost 的 DialogFragment。我有两个选项卡,一个是 DialogFragment,一个是 ListFragment。当在内部 DialogFragment 中按下“确定”按钮或按下 ListFragment 中的元素时,我想传递两个字符串(在内部 DialogFragment 的两个 TextView 中输入并显示在 ListFragment 中的每个元素中)回到 Activity,但我不确定如何处理多个级别的 Fragment。

感谢任何帮助!

【问题讨论】:

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


    【解决方案1】:

    没有魔法。

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

    1. 使用回调。

    创建接口和类,将数据通过子Fragment传递给Activity。您无需修改​​桥接的TabHostFragment,因为 Fragment 始终依赖其母 Context(Activity),无论有多少 Fragment 包裹 Fragment。

    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);
        }
    }
    

    最后让子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。

    我更喜欢使用Otto 来发布和订阅数据。

    在Activity中订阅监听事件,

    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"));
    

    【讨论】:

    • 谢谢,很有帮助!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 2013-04-08
      相关资源
      最近更新 更多