如何从First Fragment到Last Fragment获取数据?

时间:2016-07-22 14:03:49

标签: android android-viewpager fragment

我在ViewPager中有多个片段。如何将第一个EditText数据片段分段到最后片段?

我在第一个片段中设置了值,如下所示 -

 txtConsAcNo.setText(account_no);
 txtMeterSrMo.setText(mtr_serial_no);

现在我得到这个txtConsAcNo,txtMeterSrMo值,我的最后一个片段如下 -

 ConDetFirstFragment f1 = new ConDetFirstFragment();
 txtConsAcNo = f1.txtConsAcNo.getText().toString();
 txtMeterSrMo = f1.txtMeterSrMo.getText().toString();

现在我想要的是我获得Null值并且我的应用程序不幸被停止了。我希望将这些数据放到我的最后一个没有包的片段中。我怎么能做到这一点?

3 个答案:

答案 0 :(得分:1)

在不创建界面,捆绑或意图的情况下很容易实现这一点 -

我已经在所有片段中声明了所有变量" Public Static"喜欢下面 -

public static EditText txtConsAcNo, txtMeterSrMo;

在任何片段之后,我已声明变量以获取如下所示的数据 -

public static String txtConsAcNo,txtMeterSrMo;

现在我创建了一个函数来从上面的变量中获取第一个片段的值 -

public static void getalldata(){
        ConDetFirstFragment f1 = new ConDetFirstFragment();
        txtConsAcNo = f1.txtConsAcNo.getText().toString();
        txtMeterSrMo = f1.txtMeterSrMo.getText().toString();
}

快乐编码......

答案 1 :(得分:0)

这里有几个问题:

  1. 第一个片段可能已被Android系统破坏以节省内存。
  2. 您的片段不应直接与对方交谈
  3. 为了达到你所需要的,你需要跳过几个圈。

    1. 假设源文本是EditText对象(即可由用户编辑),则为每个EditText对象添加TextWatcher

    2. 创建界面:

      public interface TextPurveyor {
           void setText1(String t);
           String getText1();
           void setText2(String t);
           String getText1();
      }
      
    3. 在主机Activity中实现此接口;并在活动中本地保存文本值。不要忘记使用其余的活动状态保存/恢复它们。

    4. 使TextWatcher对象在主机活动上调用相应的setText(..)方法:

      ((TextPurveyor)getActivity()).setText1(...);
      
    5. 让每个片段检查主机活动是否实现此方法。

    6. 当第二个片段想要一个字符串时,请询问活动:

      ((TextPurveyor)getActivity()).getText1();
      

答案 2 :(得分:0)

为避免紧密耦合您的项目代码,请尝试使用已经证明最适用的设计模式,如Publisher/Subscriber,我将在下面向您展示:

我的项目中总是使用一个名为EventBus的流行库 - 只需将以下内容添加到依赖项下的build.gradle(模块级)文件中:

compile 'org.greenrobot:eventbus:3.0.0'

其次,创建一个简单的Plain Old Java Object (POJO)来代表您的活动:

public class FragmentAToLastEvent{
   private String txtConsAcNo;
   private String txtMeterSrMo;

   FragmentAToLastEvent(String acNo, String srMO){
      this.txtConsAcNo = acNO;
      this.txtMeterSrMo = srMO;
   }

   //getters and setters if needed
   public String gettxtConsAcNo(){
       return txtConsAcNo;
   }

   public String gettxtMeterSrMo(){
       return txtMeterSrMo;
   }
}

下一步是在这里实际使用您的Event类:

因此,在您希望从EditText发送文本的片段中,只需执行以下操作:

String txtConsAcNo = f1.txtConsAcNo.getText().toString();
String txtMeterSrMo = f1.txtMeterSrMo.getText().toString();
EventBus.getDefault().post(new FragmentAToLastEvent(txtConsAcNo, txtMeterSrMo));

在你的最后一个片段中,只需完成此操作即可:

片段内onCreateonAttach

//register your event - making this class a subscriber
EventBus.getDefault().register(this)

//next, override a single method to receive the values you passed from above code (Fragment 1?)

public void onEvent(FragmentAToLastEvent event){

   String txtConsAcNo = event.gettxtConsAcNo();
   String txtMeterSrMo = event.gettxtMeterSrMo();

   //now you can use your text here without problems!
}

最后,记得在onDestroy中取消注册:

@Override
public void onDestroy(){
   super.onDestroy();

   EventBus.getDefault().unregister(this);
}

这是我一直以来所做的事情,而且它更干净,没有使用你的片段必须实现的接口并完成所有这些!

我希望你觉得它对你有所帮助并祝你好运!