如何在 Android 中的多个片段之间传递数据
How to pass data between multiple Fragments in Android
在我的主 Activity 中,我有一个包含 FragmentTabHost 的 DialogFragment。我有两个选项卡,一个是 DialogFragment,一个是 ListFragment。当按下内部 DialogFragment 中的 'OK' 按钮或按下 ListFragment 中的元素时,我想传递两个字符串(在内部 DialogFragment 的两个 TextView 中输入并显示在ListFragment) 返回到 Activity,但我不确定如何使用多个级别的片段执行此操作。
感谢任何帮助!
没有魔法。
您可以通过两种方法实现。
- 使用回调。
创建接口并class将数据通过child片段传递给Activity。您无需修改桥接 TabHostFragment
,因为无论有多少片段包裹片段,Fragment 始终依赖其母上下文 (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 片段确认妈妈 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");
}
}
- 使用 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"));
查看 setTargetFragment() and getTargetFragment() 方法。您可以通过它相互连接片段,而无需任何额外的回调和库。
在我的主 Activity 中,我有一个包含 FragmentTabHost 的 DialogFragment。我有两个选项卡,一个是 DialogFragment,一个是 ListFragment。当按下内部 DialogFragment 中的 'OK' 按钮或按下 ListFragment 中的元素时,我想传递两个字符串(在内部 DialogFragment 的两个 TextView 中输入并显示在ListFragment) 返回到 Activity,但我不确定如何使用多个级别的片段执行此操作。
感谢任何帮助!
没有魔法。
您可以通过两种方法实现。
- 使用回调。
创建接口并class将数据通过child片段传递给Activity。您无需修改桥接 TabHostFragment
,因为无论有多少片段包裹片段,Fragment 始终依赖其母上下文 (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 片段确认妈妈 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");
}
}
- 使用 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"));
查看 setTargetFragment() and getTargetFragment() 方法。您可以通过它相互连接片段,而无需任何额外的回调和库。