如何通过数据从第二个活动到第一个活动时按回?——安卓

我有两个活动,Activity1Activity2

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

Activity2中我有一个EditText

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

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

152235 次浏览

Activity1应该以startActivityForResult()开始。

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

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.startActivityForResult

长一点的回答:

你应该从阅读Android开发者文档开始。具体地说,你的问题主题在Activity文档的Starting Activities and Getting Results部分中涵盖。

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

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

这是你第一次参加活动。

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


}

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

希望对你有所帮助…:)

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

其他答案不工作时,我把setResultonBackPressed。注释对超级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;
}
}
}

我有一个问题,我想在我制作的软按钮和软键中发送数据类型,这是每个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中声明了一个Field:

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:如果你想让onBackPressed方法正常工作,请记住从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();
}
}
}

就是这样,希望能帮到你。# 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();
}