通过另一个 activity 的 onClick 事件将值传递给其容器 activity 的两个片段
Passing the value to two fragments which its container activity by onClick event of another activity
我想将来自另一个 activity 的 onClick 事件的数据传递给前一个 activity 的 FRAGMENT。我可以看到日志,它显示了从 activity 到主 activity 的值,但它无法传递到主 activity 的片段。
我参考了这个link:
Send string from an activity B to a fragment F of activity A
但我是初学者,脑子笨,试了也得不到预期的结果,最重要的是,我不太明白解法的思路。
虽然我在解决这个问题的过程中阅读了很多资料和案例,但我对界面的使用感到困惑。或者我可以使用其他解决方案来实现此功能吗?
感谢您的帮助。
主要activity:
Fragment_step_1 getHashMapStep1 = new Fragment_step_1();
Fragment_step_2 getHashMapStep2 = new Fragment_step_2();
......
public void onCreate(Bundle savedInstanceState) {
......
if (savedInstanceState == null) {
Bundle extras = getIntent().getExtras();
Bundle extrasFrag2 = getIntent().getExtras();
boolean getFromConfirmPage = getIntent().getBooleanExtra("checkReturn", fromConfirm);
Log.e("boolean", String.valueOf(getFromConfirmPage));
if(extras == null) {
getEmailFromID = null;
} else {
if(getFromConfirmPage){
strFullName = extras.getString("ConfirmFullName");
strIDNum = extras.getString("ConfirmIDNum");
strDOB = extras.getString("ConfirmDOB");
strPhone = extras.getString("ConfirmPhone");
strEmail = extras.getString("ConfirmEmail");
strAddress = extras.getString("ConfirmAddress");
strPlanPrice = extras.getString("plan_price");
strPlan_type = extras.getString("ConfirmPlanType");
Bundle argsFrag1 = getHashMapStep1.getArguments();
Bundle argsFrag2 = getHashMapStep2.getArguments();
argsFrag1.putString("ConfirmFullName", strFullName);
argsFrag1.putString("ConfirmIDNum", strIDNum);
argsFrag1.putString("ConfirmPhone", strPhone);
argsFrag1.putString("ConfirmEmail", strEmail);
argsFrag2.putString("ConfirmDOB", strDOB);
argsFrag2.putString("ConfirmAddress", strAddress);
getHashMapStep1.setArguments(argsFrag1);
getHashMapStep2.setArguments(argsFrag2);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragmentPersonal, getHashMapStep1);
transaction.replace(R.id.fragment_correspondence, getHashMapStep2);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
} else {
getEmailFromID = extras.getString("Email ID");
strPlan_type = extras.getString("Plan_Type");
strPlanPrice = extras.getString("Plan_Price");
}
}
......
else {
Intent confirmInsure = new Intent(/*main_activity*/.this, /*activity_with_edit_btn*/.class);
Bundle extras = new Bundle();
extras.putString("ConfirmFullName", strFullName);
extras.putString("confirmDOB", strDOB);
extras.putString("ConfirmIDNum", strIDNum);
extras.putString("ConfirmPhone", strPhone);
extras.putString("ConfirmEmail", strEmail);
extras.putString("ConfirmAddress", strAddress);
extras.putString("plan_type", strPlan_type);
extras.putString("plan_price", strPlanPrice);
confirmInsure.putExtras(extras);
startActivity(confirmInsure);
}
}
......
}
Activity 与 "Edit" 按钮:
......
btn_editInfo.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
Intent confirmInsure = new Intent(/*activity_with_edit_btn*/.this, /*To_main_activity*/.class);
Bundle extras = new Bundle();
extras.putString("ConfirmFullName", CustName);
extras.putString("ConfirmIDNum", IDNum);
extras.putString("ConfirmDOB", strDOB);
extras.putString("ConfirmPhone", PhoneNo);
extras.putString("ConfirmEmail", email);
extras.putString("ConfirmAddress", rAddress);
extras.putString("ConfirmPlanType", formatPlanType);
extras.putString("plan_price", planPrice);
extras.putBoolean("checkReturn", fromConfirm);
confirmInsure.putExtras(extras);
startActivity(confirmInsure);
}
});
......
片段 1 和 2:
......
@Override //SHOULD I GET VALUES ON THIS METHOD?
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
Bundle args = this.getArguments();
if (args != null) {
strName = args.getString("ConfirmFullName");
strHKID = args.getString("ConfirmIDNum");
strTel = args.getString("ConfirmPhone");
strEmail = args.getString("ConfirmEmail");
name.setText(strName);
HKIDNumber.setText(strHKID);
getEmail.setText(strEmail);
phone.setText(strTel);
}
//REMAIN TWO VALUES ARE GETTING ON FRAGMENT_2
}
......
您可以使用 DataHolder(Singleton) 来保存值。您可以从您的第二个 activity 设置值,您可以获取您的片段(或整个应用程序中的任何地方)。 Singletons 整个应用程序都有一个实例。它可以贯穿您的整个应用程序。您可以从activity、片段、接口等访问它们,这将有助于在activity-片段、片段-activity、片段-片段之间保存数据和传递数据。
创建DataHolder.java
public class DataHolder {
private static DataHolder mInstance;
private String name, idNumber, dob, address, planType; //fields you want
//add all the fields you want--like email,phoneNUmber,etc.,
public static DataHolder getInstance() {
if (mInstance == null)
return mInstance = new DataHolder();
else
return mInstance;
}
//getters and setters for the fields
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPlanType() {
return planType;
}
public void setPlanType(String planType) {
this.planType = planType;
}
//define getters and setters for all defined fields
}
在您的 Activity2 中,
DataHolder holder;
btn_editInfo.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
holder = DataHolder.getInstance(); //Getting DataHolder Instance
holder.setName(CustName);
holder.setIdNumber(IDNum);
//set values for all fields using setters
//holder.setSomething(something);
//Start your first activity
Intent confirmInsure = new Intent(/*activity_with_edit_btn*/.this, /*To_main_activity*/.class);
startActivity(confirmInsure);
}});
在您的片段 1 和片段 2 中,
DataHolder holder;
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
holder = DataHolder.getInstance(); //get instance of DataHolder
name.setText(holder.getName()); //get customer name by getName()
// do the same for all fields
HKIDNumber.setText(holder.getIdNumber());
getEmail.setText(holder.getEmail());
phone.setText(holder.getPhNumber());
}
希望对您有所帮助。
我想将来自另一个 activity 的 onClick 事件的数据传递给前一个 activity 的 FRAGMENT。我可以看到日志,它显示了从 activity 到主 activity 的值,但它无法传递到主 activity 的片段。
我参考了这个link: Send string from an activity B to a fragment F of activity A
但我是初学者,脑子笨,试了也得不到预期的结果,最重要的是,我不太明白解法的思路。
虽然我在解决这个问题的过程中阅读了很多资料和案例,但我对界面的使用感到困惑。或者我可以使用其他解决方案来实现此功能吗?
感谢您的帮助。
主要activity:
Fragment_step_1 getHashMapStep1 = new Fragment_step_1();
Fragment_step_2 getHashMapStep2 = new Fragment_step_2();
......
public void onCreate(Bundle savedInstanceState) {
......
if (savedInstanceState == null) {
Bundle extras = getIntent().getExtras();
Bundle extrasFrag2 = getIntent().getExtras();
boolean getFromConfirmPage = getIntent().getBooleanExtra("checkReturn", fromConfirm);
Log.e("boolean", String.valueOf(getFromConfirmPage));
if(extras == null) {
getEmailFromID = null;
} else {
if(getFromConfirmPage){
strFullName = extras.getString("ConfirmFullName");
strIDNum = extras.getString("ConfirmIDNum");
strDOB = extras.getString("ConfirmDOB");
strPhone = extras.getString("ConfirmPhone");
strEmail = extras.getString("ConfirmEmail");
strAddress = extras.getString("ConfirmAddress");
strPlanPrice = extras.getString("plan_price");
strPlan_type = extras.getString("ConfirmPlanType");
Bundle argsFrag1 = getHashMapStep1.getArguments();
Bundle argsFrag2 = getHashMapStep2.getArguments();
argsFrag1.putString("ConfirmFullName", strFullName);
argsFrag1.putString("ConfirmIDNum", strIDNum);
argsFrag1.putString("ConfirmPhone", strPhone);
argsFrag1.putString("ConfirmEmail", strEmail);
argsFrag2.putString("ConfirmDOB", strDOB);
argsFrag2.putString("ConfirmAddress", strAddress);
getHashMapStep1.setArguments(argsFrag1);
getHashMapStep2.setArguments(argsFrag2);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragmentPersonal, getHashMapStep1);
transaction.replace(R.id.fragment_correspondence, getHashMapStep2);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
} else {
getEmailFromID = extras.getString("Email ID");
strPlan_type = extras.getString("Plan_Type");
strPlanPrice = extras.getString("Plan_Price");
}
}
......
else {
Intent confirmInsure = new Intent(/*main_activity*/.this, /*activity_with_edit_btn*/.class);
Bundle extras = new Bundle();
extras.putString("ConfirmFullName", strFullName);
extras.putString("confirmDOB", strDOB);
extras.putString("ConfirmIDNum", strIDNum);
extras.putString("ConfirmPhone", strPhone);
extras.putString("ConfirmEmail", strEmail);
extras.putString("ConfirmAddress", strAddress);
extras.putString("plan_type", strPlan_type);
extras.putString("plan_price", strPlanPrice);
confirmInsure.putExtras(extras);
startActivity(confirmInsure);
}
}
......
}
Activity 与 "Edit" 按钮:
......
btn_editInfo.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
Intent confirmInsure = new Intent(/*activity_with_edit_btn*/.this, /*To_main_activity*/.class);
Bundle extras = new Bundle();
extras.putString("ConfirmFullName", CustName);
extras.putString("ConfirmIDNum", IDNum);
extras.putString("ConfirmDOB", strDOB);
extras.putString("ConfirmPhone", PhoneNo);
extras.putString("ConfirmEmail", email);
extras.putString("ConfirmAddress", rAddress);
extras.putString("ConfirmPlanType", formatPlanType);
extras.putString("plan_price", planPrice);
extras.putBoolean("checkReturn", fromConfirm);
confirmInsure.putExtras(extras);
startActivity(confirmInsure);
}
});
......
片段 1 和 2:
......
@Override //SHOULD I GET VALUES ON THIS METHOD?
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
Bundle args = this.getArguments();
if (args != null) {
strName = args.getString("ConfirmFullName");
strHKID = args.getString("ConfirmIDNum");
strTel = args.getString("ConfirmPhone");
strEmail = args.getString("ConfirmEmail");
name.setText(strName);
HKIDNumber.setText(strHKID);
getEmail.setText(strEmail);
phone.setText(strTel);
}
//REMAIN TWO VALUES ARE GETTING ON FRAGMENT_2
}
......
您可以使用 DataHolder(Singleton) 来保存值。您可以从您的第二个 activity 设置值,您可以获取您的片段(或整个应用程序中的任何地方)。 Singletons 整个应用程序都有一个实例。它可以贯穿您的整个应用程序。您可以从activity、片段、接口等访问它们,这将有助于在activity-片段、片段-activity、片段-片段之间保存数据和传递数据。
创建DataHolder.java
public class DataHolder {
private static DataHolder mInstance;
private String name, idNumber, dob, address, planType; //fields you want
//add all the fields you want--like email,phoneNUmber,etc.,
public static DataHolder getInstance() {
if (mInstance == null)
return mInstance = new DataHolder();
else
return mInstance;
}
//getters and setters for the fields
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPlanType() {
return planType;
}
public void setPlanType(String planType) {
this.planType = planType;
}
//define getters and setters for all defined fields
}
在您的 Activity2 中,
DataHolder holder;
btn_editInfo.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
holder = DataHolder.getInstance(); //Getting DataHolder Instance
holder.setName(CustName);
holder.setIdNumber(IDNum);
//set values for all fields using setters
//holder.setSomething(something);
//Start your first activity
Intent confirmInsure = new Intent(/*activity_with_edit_btn*/.this, /*To_main_activity*/.class);
startActivity(confirmInsure);
}});
在您的片段 1 和片段 2 中,
DataHolder holder;
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
holder = DataHolder.getInstance(); //get instance of DataHolder
name.setText(holder.getName()); //get customer name by getName()
// do the same for all fields
HKIDNumber.setText(holder.getIdNumber());
getEmail.setText(holder.getEmail());
phone.setText(holder.getPhNumber());
}
希望对您有所帮助。