簡體   English   中英

按下后如何將數據從第二個活動傳遞到第一個活動? - android

[英]How to pass data from 2nd activity to 1st activity when pressed back? - android

我有 2 個活動, Activity1Activity2

Activity1我有一個ButtonTextView 單擊按鈕時, Activity2將啟動。

Activity2我有一個EditText

當從Activity2按下返回時,我想在Activity1TextView中的Activity2中顯示從EditText檢索到的數據。

有人可以幫我編寫代碼來完成這項工作嗎?

使用startActivityForResult啟動Activity2,並使用setResult方法將數據從Activity2發送回Activity1。 在Activity1中,您將需要重寫onActivityResult ,以使用Activity2中的EditText數據更新TextView

例如:

Activity1中 ,以以下方式啟動Activity2:

Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, 1);

Activity2中 ,使用setResult將數據發送回去:

Intent intent = new Intent();
intent.putExtra("editTextValue", "value_here")
setResult(RESULT_OK, intent);        
finish();

Activity1中 ,使用onActivityResult接收數據:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
         if(resultCode == RESULT_OK) {
             String strEditText = data.getStringExtra("editTextValue");
         }     
    }
} 

如果可以,還可以使用SharedPreferences在Activity之間共享數據。

Activity1應該使用startActivityForResult()啟動Activity2

Activity2應該使用setResult()將數據發送回Activity1

Activity2中

@Override
public void onBackPressed() {
    String data = mEditText.getText();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(resultcode, intent);
}

活動1中

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}

當我將setResult放在onBackPressed時,其他答案onBackPressed 評論對super onBackPressed調用finish手動finish調用可以解決此問題:

@Override
public void onBackPressed() {
    //super.onBackPressed();
    Intent i = new Intent();
    i.putExtra(EXTRA_NON_DOWNLOADED_PAGES, notDownloaded);
    setResult(RESULT_OK, i);
    finish();
}

在第一個活動中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == QUEUE_MSG) {
        if (resultCode == RESULT_OK) {
            Serializable tmp = data.getSerializableExtra(MainActivity.EXTRA_NON_DOWNLOADED_PAGES);
            if (tmp != null)
                serializable = tmp;
        }
    }
}

將此作為StartActivityforResult的替代方法。但是請記住,在這種情況下,這種方法的性能可能會很昂貴,但在某些情況下可能需要使用。

在活動2中,

@Override
public void onBackPressed() {
String data = mEditText.getText();
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
Editor editor = sp.edit();
editor.putString("email",data);
editor.commit();
}

在活動1中,

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 

閱讀以下內容:

  1. 返回結果到onActivityResult()
  2. 從調用的活動中獲取結果-適用於初學者的Android教程

這些文章將幫助您了解如何在Android的兩個活動之間傳遞數據。

這是您的第一個Activity1。

public class Activity1 extends Activity{
private int mRequestCode = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, Activity2.class);
    startActivityForResult(intent, mRequestCode);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == mRequestCode && resultCode == RESULT_OK){
        String editTextString = data.getStringExtra("editText");
    }
}
}

從這里開始,您將使用startActivityForResult(mRequestCode,Activity2.class)啟動Activity2.class。

現在這是您的第二個活動,名稱是Activity2

public class Activity2 extends Activity {
private EditText mEditText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //mEditText = (EditText)findViewById(R.id.edit_text);

    Intent intent = new Intent();
    intent.putExtra("editText", mEditText.getText().toString());
    setResult(RESULT_OK, intent);
}

}

現在,當您完成第二個Activity時,您可以從onBackPress()或從任何按鈕單擊中調用setResult()方法,當Activity2銷毀時,將從那里調用您的Activity1的回調方法onActivityResult() ,您可以從intent中獲取數據..

希望對您有幫助... :)

在您的FirstActivity中,使用startActivityForResult()方法調用SecondActivity。

例如:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

在您的SecondActivity中,設置要返回到FirstActivity的數據。 如果您不想返回,請不要進行任何設置。

例如:如果要發送回數據,請在secondActivity中:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

如果您不想返回數據:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

現在,在FirstActivity類中,為onActivityResult()方法編寫以下代碼。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}

TL; DR使用Activity.startActivityForResult

長答案:

您應該先閱讀Android開發人員文檔。 具體而言, Activity文檔的“ Starting Activities and Getting Results部分涵蓋了您的問題主題。

作為示例代碼,Android SDK提供了很好的示例。 另外,這里的其他答案也為您提供了一些簡短的示例代碼片段供您使用。

但是,如果您正在尋找替代品,請閱讀此SO問題 這是關於如何將startActivityForResults與片段以及如何在活動之間傳遞數據的其他方法結合使用的很好的討論。

和我有我想要做的,我犯了一個軟按鈕並在每一個Android設備的默認軟鍵這個數據發送類型的問題,所以我做了這一點,首先我做了一個Intent在我的“ A” Activity

            Intent intent = new Intent();
            intent.setClass(context, _AddNewEmployee.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivityForResult(intent, 6969);
            setResult(60);

然后在第二個活動中,我在“ B” Activity聲明了一個字段:

private static int resultCode = 40;

然后,在我成功提出請求之后,或者每當我想告訴“ A”活動此工作成功完成時,都將resultCode的值更改為我在“ A” Activity所說的值,在我的情況下為“ 60”接着:

private void backToSearchActivityAndRequest() {
    Intent data = new Intent();
    data.putExtra("PhoneNumber", employeePhoneNumber);
    setResult(resultCode, data);
    finish();
}

@Override
public void onBackPressed() {
    backToSearchActivityAndRequest();
}

PS:請記住刪除Super如果你想為此才能正常工作從onBackPressed方法。

那么我也應該在“ A”活動中調用onActivityResult方法:

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 6969 && resultCode == 60) {
            if (data != null) {
                    user_mobile = data.getStringExtra("PhoneNumber");
                    numberTextField.setText(user_mobile);
                    getEmployeeByNumber();
            }
        }
    }

就是這樣,希望它能對您有所幫助。 #HappyCoding;

2021年java新更新后:

在 MainActivity 中使用 activityresultlauncher() 而不是 startactivityforresult()。

ActivityResultLauncher<Intent> activityResultLaunch = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if (result.getResultCode() == 123) {
                    Intent data = result.getData();
                    String myStr = data.getStringExtra("MyData");

                    if (!TextUtils.isEmpty(myStr )) {
                        myTextView.setText(myStr);
                    }

                }
            }
        });

在 onCreate() 內部:

myBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, Second.class);
            activityResultLaunch.launch(intent);
        }
    });

SecondActivity 內部(onCreate 外部):

@Override
public void onBackPressed() {
    String data = myEditText.getText().toString();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(123, intent);
    finish();
}

暫無
暫無

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

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