我正在尝试将数据从片段传递到ViewPager幻灯片片段。 我的活动xml分为两半。 1使用按钮侦听器输入的片段。 3片段幻灯片用于输出。 我想要做的是将数据从片段(输入)传递到所有3片段幻灯片(输出),所以我可以刷过我计算的数据。
我尝试使用接口将数据从Fragment(输入)通过Activity传递到Fragment幻灯片。一旦按下按钮监听器发送数据,我的应用程序崩溃。我得到一个NullPointerException。
使这项工作成为最好或最简单的方法是什么?我真的很困惑这个问题。
THX。
答案 0 :(得分:0)
我认为你应该通过在FragmentPagerAdapter中添加一个帮助代码来保留每个片段的引用。每个片段都应该实现一个接口。只要需要,检查实例是否不等于null,然后调用interface方法传递数据。
下面的代码将帮助您保留片段的引用。 https://stackoverflow.com/a/29269509/4901098
答案 1 :(得分:0)
尝试此方法:将以下内容添加到module
级build.gradle
文件
compile 'org.greenrobot:eventbus:3.0.0'
然后,创建一个代表您的Event的常规java类。
public class UpdateFragmentsUIEvent{
//add your values you want to pass to your other fragments
private String valueA;
private String valueB;
private String valueC;
//.....others?
public UpdateFragmentsUIEvent(){
}
//add getters and setters here
}
现在您已经在要更新的片段(不是第一个,而是要将数据传递到的片段)中创建了事件类,请执行以下操作:
public class FragmentB extends Fragment{
@Override
public void onAttach(Context context){
super.onAttach(context);
//important here - could be done inside onCreate()
EventBus.getDefault().register(this);
}
//very important here as well
public void onEvent(UpdateFragmentsUIEvent event){
/* this event instance has all your values here now */
String valueA = event.getValueA();
String valueB = event.getValueB();
/* Now you can update your views accordingly */
}
/* don't forget to unregister inside onDestroy */
@Override
public void onDestroy(){
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
最后,要实际通知您的片段,您必须在第一个片段中发布这样的新创建事件,我认为这是您输入值的位置:
//somewhere when a button is clicked after entering data
EventBus.getDefault().post(new UpdateFragmentsUIEvent(valueA, valueB, valueC));
就这样,你就完成了!忘记接口并坚持使用松散耦合代码之后的推荐设计模式,例如本例中使用的发布者/订阅者模式。
我希望这会有所帮助,如果您需要更多帮助,请告诉我们!