将数据从片段传递到viewpager

时间:2016-06-12 13:19:56

标签: android android-fragments

我正在尝试将数据从片段传递到ViewPager幻灯片片段。 我的活动xml分为两半。 1使用按钮侦听器输入的片段。 3片段幻灯片用于输出。 我想要做的是将数据从片段(输入)传递到所有3片段幻灯片(输出),所以我可以刷过我计算的数据。

我尝试使用接口将数据从Fragment(输入)通过Activity传递到Fragment幻灯片。一旦按下按钮监听器发送数据,我的应用程序崩溃。我得到一个NullPointerException。

使这项工作成为最好或最简单的方法是什么?我真的很困惑这个问题。

THX。

2 个答案:

答案 0 :(得分:0)

我认为你应该通过在FragmentPagerAdapter中添加一个帮助代码来保留每个片段的引用。每个片段都应该实现一个接口。只要需要,检查实例是否不等于null,然后调用interface方法传递数据。

下面的代码将帮助您保留片段的引用。 https://stackoverflow.com/a/29269509/4901098

答案 1 :(得分:0)

尝试此方法:将以下内容添加到modulebuild.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));

就这样,你就完成了!忘记接口并坚持使用松散耦合代码之后的推荐设计模式,例如本例中使用的发布者/订阅者模式。

我希望这会有所帮助,如果您需要更多帮助,请告诉我们!