如何从第一个片段获取数据到最后一个片段?
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 值,不幸的是我的应用程序被停止了。我想在没有捆绑包的情况下将这些数据获取到我的最后一个片段。我怎样才能做到这一点?
这里有几个问题:
- 第一个片段可能已被 Android 系统销毁以节省内存。
- 你的片段不应该直接互相交谈
要实现你所需要的,你需要跳过几个箍。
假设源文本是EditText对象(即用户可编辑的),然后为每个EditText对象添加一个TextWatcher。
创建接口:
public interface TextPurveyor {
void setText1(String t);
String getText1();
void setText2(String t);
String getText1();
}
在主机中实现这个接口[=52=];并将文本值本地保存在 activity 中。不要忘记 save/restore 它们与 Activity 状态的其余部分。
使 TextWatcher 对象在主机上调用适当的 setText(..) 方法 activity:
((TextPurveyor)getActivity()).setText1(...);
让每个片段检查宿主activity是否实现了这个方法。
当第二个片段需要字符串时,向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));
在您的最后一个片段中,只需执行此操作即可完成:
在您的片段 onCreate
或 onAttach
内:
//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);
}
这是我一直以来所做的,它更简洁,没有使用您的片段必须实现的接口并完成所有这些工作!
希望对您有所帮助,祝您好运!
我在 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 系统销毁以节省内存。
- 你的片段不应该直接互相交谈
要实现你所需要的,你需要跳过几个箍。
假设源文本是EditText对象(即用户可编辑的),然后为每个EditText对象添加一个TextWatcher。
创建接口:
public interface TextPurveyor { void setText1(String t); String getText1(); void setText2(String t); String getText1(); }
在主机中实现这个接口[=52=];并将文本值本地保存在 activity 中。不要忘记 save/restore 它们与 Activity 状态的其余部分。
使 TextWatcher 对象在主机上调用适当的 setText(..) 方法 activity:
((TextPurveyor)getActivity()).setText1(...);
让每个片段检查宿主activity是否实现了这个方法。
当第二个片段需要字符串时,向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));
在您的最后一个片段中,只需执行此操作即可完成:
在您的片段 onCreate
或 onAttach
内:
//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);
}
这是我一直以来所做的,它更简洁,没有使用您的片段必须实现的接口并完成所有这些工作!
希望对您有所帮助,祝您好运!