我有两个活动,Activity1和Activity2。

在Activity1中我有一个按钮和TextView。 当单击按钮时,Activity2启动。

在Activity2中,我有一个EditText。

我想在Activity1的TextView中显示从Activity2中的EditText检索到的数据,当从Activity2按回时。

有人能帮我写代码让它工作吗?


当前回答

其他答案不工作时,我把setResult在onBackPressed。注释调用super onBackPressed和手动调用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;
        }
    }
}

其他回答

使用Activity.startActivityForResult

长一点的回答:

你应该从阅读Android开发者文档开始。具体地说,您的问题主题在活动文档的启动活动和获得结果部分中涵盖。

至于示例代码,Android SDK提供了很好的示例。另外,这里的其他答案为您提供了简短的示例代码片段。

然而,如果你正在寻找替代品,请阅读这个SO问题。这是一个关于如何在片段中使用startActivityForResults的很好的讨论,以及在活动之间传递数据的其他一些方法。

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

这是你第一次参加活动。

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

从这里你开始你的Activity2.class使用startActivityForResult(mRequestCode, 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);
}

}

现在,当你完成你的第二个活动,然后你调用setResult()方法,从onBackPress()或从任何按钮点击当你的Activity2将破坏然后你的Activity1的回调方法onActivityResult()将从那里调用,你可以从意图获得你的数据。

希望对你有所帮助…:)

其他答案不工作时,我把setResult在onBackPressed。注释调用super onBackPressed和手动调用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;
        }
    }
}

将This作为startActivityforResult的替代。但是请记住,在这种情况下,这种方法在性能方面可能是昂贵的,但在某些情况下可能需要使用。

Activity2,

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

在Activity1,

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