【问题标题】:Passing extras between activities and forwarding them to a single activity在活动之间传递额外内容并将它们转发到单个活动
【发布时间】:2016-05-21 12:55:25
【问题描述】:

我的应用程序是一个基本的登录应用程序,最后将显示用户为其他活动中的字段输入的所有值。我正在使用意图对象和标志。活动使用:

  • 意图额外存储键值,
  • FLAG_ACTIVITY_FORWARD_RESULT
  • startActivityForResult() 和 onActivityForResult() 方法

因此,命名为 AActivity、BActivity、Caactivity 的活动和导航流程必须是:A → B → C → A,结果来自 B 和 C。

我对代码逻辑的理解是,这告诉 Android 活动 3 应将其结果转发回调用活动 2 的活动,在本例中为活动 1。并且当活动 3 设置它的结果并完成时,活动 1 中的 onActivityResult() 将使用活动 3 发送的结果数据进行调用。

但是,当我运行应用程序时,我只从活动 3 获得结果,但从活动 2 接收到 null,在活动 1 的 TextView 中显示为 null,null,valueC,valueC,如图所示。 click for the image

我用谷歌搜索了类似的问题,但无法解决问题。

提前感谢您的帮助

这是我的代码:

一个活动:

public class AActivity extends AppCompatActivity {

private static final int REQUEST_CODE = 1;

Button btnStart;
TextView userDetails;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);

    userDetails = (TextView) findViewById(R.id.userdetails);
    btnStart = (Button) findViewById(R.id.btnstart);

    btnStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent activityAIntent = new Intent(AActivity.this, BActivity.class);
            startActivityForResult(activityAIntent, REQUEST_CODE);
        }
    });
}


protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if ((requestCode == REQUEST_CODE) && (resultCode == RESULT_OK)) {

        String return_userName = data.getExtras().getString("username");
        String return_userPassword = data.getExtras().getString("password");
        String return_secretQuestion = data.getExtras().getString("secretquestion");
        String return_secretAnswer = data.getExtras().getString("secretanswer");
        userDetails.setText("Your details: " + return_userName + "," + return_userPassword +
                "," + return_secretQuestion + "," + return_secretAnswer);
    }
}

}

B活动:

public class BActivity extends AppCompatActivity {

EditText userName,userPassword;
Button btnCancel,btnNext;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);

    userName=(EditText)findViewById(R.id.username);
    userPassword=(EditText)findViewById(R.id.userpassword);
    btnCancel=(Button)findViewById(R.id.btncancel);
    btnNext=(Button)findViewById(R.id.btnnext);

    btnCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent_back_to_a = new Intent(BActivity.this,AActivity.class);
            startActivity(intent_back_to_a);
        }
    });

    btnNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent activityCIntent = new Intent(BActivity.this,CActivity.class);
            activityBIntent.putExtra("username",userName.getText().toString());
            activityBIntent.putExtra("password",userPassword.getText().toString());
            intent_to_c.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
            startActivity(activityBIntent);
            finish();
        }
    });
}

}

CActivity:

public class CActivity extends AppCompatActivity {

EditText secretQuestion, secretAnswer;
Button btnCancel,btnNext;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_c);

    secretQuestion =(EditText)findViewById(R.id.secretquestion);
    secretAnswer =(EditText)findViewById(R.id.secretanswer);
    btnCancel =(Button)findViewById(R.id.btncancel);
    btnNext =(Button)findViewById(R.id.btnnext);

    btnCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent_back_to_a = new Intent(CActivity.this,AActivity.class);
            startActivity(intent_back_to_a);
        }
    });

    btnNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent data = new Intent(CActivity.this,AActivity.class);
            data.putExtra("secretquestion",secretQuestion.getText().toString());
            data.putExtra("secretanswer",secretAnswer.getText().toString());

            setResult(RESULT_OK,data);
            finish();
        }
    });
}

}

【问题讨论】:

    标签: android-intent android-activity onactivityresult startactivityforresult subactivity


    【解决方案1】:

    找到解决方案

    嗨。最后我弄清楚了我做错了什么。因此,错误基本上出在 Activity C 上,我在其中创建了一个新的 Intent 并向其添加附加内容以传递给 Activity A,而不是从 2 中捕获转发的 Intent 并添加附加内容以与现有的 Intent 合并。

    修改了它并对Activity A的onActivirtForResult()方法做了一点小改动,现在我完美地得到了从其他Activity输入的Activity A中的所有值。

    希望我的解决方案也能对其他人有所帮助。所以变化如下:

    在 CActivity 中:

     btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent activityBIntent = getIntent();
                activityBIntent.putExtra("secretquestion",secretQuestion.getText().toString());
                activityBIntent.putExtra("secretanswer",secretAnswer.getText().toString());
    
                setResult(RESULT_OK,activityBIntent);
                finish();
            }
        });
    

    在 AActivity 中:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case ACTIVITY1:
                if (resultCode == RESULT_OK) {
    
                    String value_username = data.getExtras().getString("username");
                    String value_password = data.getExtras().getString("password");
                    String value_secretquestion = data.getExtras().getString("secretquestion");
                    String value_secretanswer = data.getExtras().getString("secretanswer");
                    userDetails.setText(value_username + value_password + value_secretquestion + value_secretanswer);
                }
                break;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2020-12-15
      • 1970-01-01
      相关资源
      最近更新 更多