我正在寻找在没有替换的情况下在Fragments之间传递参数的解决方案。我有2个片段,Frag1和Frag2。 Frag1需要Frag2的一些信息,但我无法替换Frag2。
如何将参数从Frag2发送到Frag1而不替换它?
答案 0 :(得分:2)
请考虑使用像greenrobot EventBus这样的事件总线库。有了它,您将从一个片段发布消息并在另一个片段中接收消息。它同时非常简单而且非常强大。
答案 1 :(得分:1)
您可以借助其主持人活动和听众在两个片段之间创建一个沟通渠道。
必须发送数据的片段可以使用由主机活动实现的监听器,以下是如何完成的:
public static class FragmentA extends ListFragment {
...
// Container Activity must implement this interface
public interface OnArticleSelectedListener {
public void onArticleSelected(int position);
}
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Send the event and position to the host activity
mListener.onArticleSelected(position);
}
}
托管2个片段的Activity的代码,包含触发器调用第二个托管片段的侦听器实现。
public static class MainActivity extends Activity
implements OnArticleSelectedListener{
...
public void onArticleSelected(int position) {
// The user selected the headline of an article from the FragmentA
// Do something here to display that article
FragmentB articleFrag = (FragmentB)
getSupportFragmentManager().findFragmentById(R.id.article_fragment);
articleFrag.doWhateverWithDataFromFragmentA(position);
}
}
最后,执行获取数据的接收器Fragment。
public static class FragmentB extends Fragment {
...
// This can also have another or the same listener to send data back,
// in case of the same, I think its better to have 2 different methods
// to avoid getting in an infinite loop.
public void doWhateverWithDataFromFragmentA(int position) {
// Got the data from A!
}
}
来源/参考:整个想法基于Android开发人员的两个教程的组合: Communicating with the Activity和Communicating with Other Fragments
一般来说,
这是将操作或操作本身的数据从一个片段传输到另一个片段的有用方法。
如果您只需在片段之间共享数据,请考虑将数据保存在Host Activity中并从两个片段中访问它们。如果主机活动中的数据对象为private MySharedDataObject thisLocalPrivateObject;
,则可以使用以下内容从片段中引用它:
MySharedDataObject data = ((MyHostActivityName) getActivity()).getSharedData();