【问题标题】:How to get data from First Fragment to Last Fragment?如何从第一个片段获取数据到最后一个片段?
【发布时间】:2016-07-22 14:03:49
【问题描述】:

我在 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 值并且我的应用程序不幸停止了。我想在没有捆绑的情况下将此数据获取到我的最后一个片段。我怎样才能做到这一点?

【问题讨论】:

    标签: android android-viewpager fragment


    【解决方案1】:

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

    我已经声明了所有片段“公共静态”中的所有变量,如下所示 -

    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();
    }
    

    快乐编码...

    【讨论】:

    • 你确定这是最好的方法吗?保持这样的引用并不好,因为您的类将具有紧密耦合
    • 接受我的回答以帮助他人。
    • 让OP在接受答案之前尝试最佳解决方案;这就是 SO 的工作原理!
    【解决方案2】:

    这里有几个问题:

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

    要实现您的需要,您需要跳过一些障碍。

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

    2. 创建接口:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      在您的最后一个片段中,只需执行以下操作即可完成:

      在您的 Fragment 的 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);
      }
      

      这是我一直在做的事情,而且它更简洁,无需使用您的片段必须实现并完成所有这些操作的接口!

      希望对你有帮助,祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多