簡體   English   中英

在活動之間傳遞額外內容並將其轉發到單個活動

[英]Passing extras between activities and forwarding them to a single activity

我的應用程序是一個基本的登錄應用程序,最后將顯示用戶在其他活動中輸入的所有值。 我正在使用意圖對象和標志。 活動用途:

  • 打算額外存儲鍵值,
  • 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,如圖所示。 點擊圖片

我用谷歌搜索了出現的類似問題,但無法解決問題。

預先感謝您的幫助

這是我的代碼:

活動:

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

}

活動:

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

}

活動:

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

}

找到的解決方案

你好 終於,我弄清楚了我做錯了什么。 因此,錯誤基本上是在活動C上,我在其中創建了一個新的意圖並將其附加內容傳遞給活動A,而不是從2中捕獲轉發的意圖並添加附加內容以與現有的意圖合並。

對其進行修改並在活動A的onActivirtForResult()方法中進行少量更改之后,現在,我可以完美地獲得從其他活動輸入的活動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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM