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

安迪·汤普森(Andy Thompson)

在我的主活动中,我有一个DialogFragment,其中包含FragmentTabHost。我有两个选项卡,一个是DialogFragment,一个是ListFragment。当在内部DialogFragment中按下“确定”按钮或在ListFragment中的元素被按下时,我要传递两个字符串(在内部DialogFragment中的两个TextView中输入,并显示在ListFragment中的每个元素中)回到活动,但我不确定如何使用多个级别的片段来执行此操作。

任何帮助表示赞赏!

荣载

没有魔术。

您可以使用两种方法来实现。

  1. 使用回调。

创建接口和类以将数据通过子Fragment传递给Activity。您无需修改​​桥接,TabHostFragment因为无论包裹多少片段,片段始终依赖于其母上下文(活动)。

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来发布和订阅数据。

要订阅活动以监听“活动”,

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章