我有两个活动,Activity1和Activity2。
Activity1
在Activity2中我有一个EditText。
Activity2
当从Activity2返回时,我想在Activity1中的TextView中显示从Activity2中的EditText中检索到的数据。
有人能帮我写代码让它工作吗?
Activity1应该以startActivityForResult()开始。
startActivityForResult()
Activity2应该使用setResult()将数据发送回Activity1。
setResult()
在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。
startActivityForResult
setResult
onActivityResult
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
Activity.startActivityForResult
长一点的回答:
你应该从阅读Android开发者文档开始。具体地说,你的问题主题在Activity文档的Starting Activities and Getting Results部分中涵盖。
Activity
Starting Activities and Getting Results
至于示例代码,Android SDK提供了很好的示例。另外,这里的其他答案为您提供了简短的示例代码片段。
然而,如果你正在寻找替代方法,请阅读这个SO问题。这是一个关于如何将startActivityForResults与片段一起使用的很好的讨论,以及在活动之间传递数据的其他一些方法。
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(); }
@Override public void onResume() { SharedPreferences sp = getSharedPreferences("LoginInfos", 0); String dataFromOtherAct= sp.getString("email", "no email"); }
其他答案不工作时,我把setResult在onBackPressed。注释对超级onBackPressed的调用并手动调用finish可以解决这个问题:
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 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。
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(); }