如何从第一个片段获取数据到最后一个片段?

How to get data from First Fragment to Last 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 值,不幸的是我的应用程序被停止了。我想在没有捆绑包的情况下将这些数据获取到我的最后一个片段。我怎样才能做到这一点?

这里有几个问题:

  1. 第一个片段可能已被 Android 系统销毁以节省内存。
  2. 你的片段不应该直接互相交谈

要实现你所需要的,你需要跳过几个箍。

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

  2. 创建接口:

    public interface TextPurveyor {
         void setText1(String t);
         String getText1();
         void setText2(String t);
         String getText1();
    }
    
  3. 在主机中实现这个接口[=52​​=];并将文本值本地保存在 activity 中。不要忘记 save/restore 它们与 Activity 状态的其余部分。

  4. 使 TextWatcher 对象在主机上调用适当的 setText(..) 方法 activity:

    ((TextPurveyor)getActivity()).setText1(...);
    
  5. 让每个片段检查宿主activity是否实现了这个方法。

  6. 当第二个片段需要字符串时,向activity询问:

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

无需创建界面、捆绑包或意图即可轻松实现 -

我已经在所有片段 "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();
}

快乐编码...

为避免紧密耦合您的项目代码,请尝试使用已被证明最有效的设计模式,例如 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;
   }
}

下一步是在此处实际使用您的事件 class:

因此,在您想要从 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);
}

这是我一直以来所做的,它更简洁,没有使用您的片段必须实现的接口并完成所有这些工作!

希望对您有所帮助,祝您好运!