java - 通过另一个 Activity 的 onClick 事件将值传递给其容器 Activity 的两个 fragment

标签 java android android-fragments interface bundle

我想将数据从另一个 Activity 的 onClick 事件传递到上一个 Activity 的 FRAGMENT。我可以看到日志,它显示从 Activity 到主 Activity 的值,但它无法传递到主 Activity 的 fragment 。

我引用了此链接: Send string from an activity B to a fragment F of activity A

但是我是一个初学者,头脑比较笨,我尝试过并没有得到预期的结果,而且最重要的是,我不太理解解决方案的想法。

尽管我在解决此问题时阅读了许多资料和案例,但我对界面的使用感到困惑。或者我可以使用其他解决方案来实现这个功能吗?

感谢您的帮助。

enter image description here

主要 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 :

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

fragment 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 中设置值,并且可以进入 fragment (或整个应用程序中 - 无论您想要在哪里)。 Singletons整个应用程序只有一个实例。它可以贯穿您的整个申请过程。您可以从activity、fragment、接口(interface)等访问它们,这将有助于保存数据以及在activity-fragment、fragment-activity、fragment-fragment之间传递数据。

创建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);
    }});

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

希望对您有帮助。

关于java - 通过另一个 Activity 的 onClick 事件将值传递给其容器 Activity 的两个 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40105353/

相关文章:

Android Recyclerview 向下滚动时滞后

java - 为什么我无法通过 Java API 连接到 ElasticSearch?

java - Google Play 服务更新到版本 13 后,出现错误

android - 即使设置了正确的尺寸,相机预览也会被拉伸(stretch)

java - 我们需要在哪个 fragment 方法中消费长期的weservice

android - 菜单未出现在 Fragment 中

java - Mime4j:DefaultMessageBuilder 无法解析 mbox 内容

java - JPA连接表查询

java - 在第 3 方类上更改 json 属性 jackson 的字段

android - 如何在 textview 中添加 imageview 或在 imageview 中添加 textview,android?