在Activity1中,我有一个Button和一个TextView。 当点击按钮时会启动Activity2。
在Activity2中,我有一个EditText。
我想在从Activity2按下后退键返回Activity1时,在Activity1的TextView中显示从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在活动之间共享数据。
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);
}
在Activity1中,
onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == RESULT_OK) {
String myStr=data.getStringExtra("MyData");
mTextView.setText(myStr);
}
}
}
当我在onBackPressed
中使用setResult
时,其他答案都无效。注释掉调用超类的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;
}
}
}
onBackPressed()
方法被重写了,所以返回功能不起作用。你需要手动调用 finish()
。 - Gaurav Mall这是一个替代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();
}
@Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String dataFromOtherAct= sp.getString("email", "no email");
}
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();
}
finish()
函数如下:override fun finish() {
setResult(RESULT_OK, Intent().apply { putExtra("Parameters", Gson().toJson(result)) })
super.finish()
}
我们可以通过覆盖finish()
函数来设置活动结果。因此,即使用户离开活动而没有触摸返回按钮,此方法也会起作用... - E. Kolverpublic 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 类。
现在这是您的第二个活动,名称为 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);
}
}
我有一个问题,想在我创建的软按钮中使用发送数据类型,并且这个软件按键是每个Android设备上默认的。所以,我先在我的“A”Activity
中创建了一个Intent
:
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" Activity任务已经完成时,将resultCode的值更改为我在"A" Activity中所说的相同值,对于我来说是"60",然后:
private void backToSearchActivityAndRequest() {
Intent data = new Intent();
data.putExtra("PhoneNumber", employeePhoneNumber);
setResult(resultCode, data);
finish();
}
@Override
public void onBackPressed() {
backToSearchActivityAndRequest();
}
提示:如果您想使此功能正常工作,记得从onBackPressed方法中删除Super
。
然后我也应该在"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();
}
}
}
简而言之,请使用Activity.startActivityForResult
。
详细回答:
您应该首先阅读Android开发者文档。具体来说,您的问题涉及到Activity
文档中Starting Activities and Getting Results
部分的内容。
至于示例代码,Android SDK提供了很好的示例。此外,其他答案在这里给出了可用的简短代码片段。
然而,如果您正在寻找替代方案,请阅读this SO question。这是一个关于如何在片段中使用startActivityForResults
以及在活动之间传递数据的几种方法的讨论。
startActivityForResult
的内容。 - Dmitry Zaytsev