按下后如何将数据从第二个活动传递到第一个活动? - 安卓
Posted
技术标签:
【中文标题】按下后如何将数据从第二个活动传递到第一个活动? - 安卓【英文标题】:How to pass data from 2nd activity to 1st activity when pressed back? - android 【发布时间】:2012-12-26 21:00:38 【问题描述】:我有 2 个活动,Activity1 和 Activity2。
在Activity1
中,我有一个Button 和TextView。
单击按钮时,Activity2 会启动。
在Activity2
我有一个EditText。
我想在 Activity1 的 TextView 中显示从 Activity2 中的 EditText 检索到的数据,当返回时从 Activity2 按下。
有人可以帮我编写代码来完成这项工作吗?
【问题讨论】:
了解startActivityForResult
***.com/questions/2694947/…
另一种方式:Activity2
将值放入持久存储中,Activity1
从那里读取。
@kumareloaded:请您在这里分享解决方案。截至目前,Pastebin 无法在我的国家/地区使用。
How to pass the values from one activity to previous activity的可能重复
【参考方案1】:
我有一个问题,我想在我制作的软按钮和每个 android 设备中的默认软键中发送数据类型,所以我已经做到了,首先我做了我的“A”中的Intent
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:如果您希望它正常工作,请记住从 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();
就是这样,希望对你有所帮助。 #快乐编码;
【讨论】:
【参考方案2】: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);
【讨论】:
@Swayam 我猜是因为您没有提到 activity1 应该使用 startactivityforresult 启动 activity2。 @LutfiTekin:很可能就是这样!感谢您指出!编辑了我的答案。 :)【参考方案3】:使用 startActivityForResult() 方法从您的 FirstActivity 调用 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
【讨论】:
【参考方案4】:使用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 在活动之间共享数据。
【讨论】:
谢谢你,如果可以的话,你能帮我用 SharedPreferences 的类似编码部分来做同样的事情:) @kumareloaded :最欢迎的朋友。如果您想使用SharedPreferences
做同样的事情,请参阅this 示例
@kumareloaded : 如果你给我两个类的代码链接以及你使用pastebin.com 尝试过的内容,那么我将编辑你的代码
@kumareloaded : 现在使用this 代码,这样就可以了
@ρяσѕρєяK:您能否在回答中使用 SharedPref 分享上述场景的代码。 Pastebin 并未在许多国家/地区开放。在这里分享会很有帮助,谢谢。【参考方案5】:
当我将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;
【讨论】:
好点。onBackPressed()
方法被覆盖,所以 back 函数不起作用。您必须手动调用finish()
。【参考方案6】:
阅读这些:
-
Return result to onActivityResult()
Fetching Result from a called activity - Android Tutorial for Beginners
这些文章将帮助您了解如何在 Android 中的两个 Activity 之间传递数据。
【讨论】:
【参考方案7】:将此作为 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");
【讨论】:
这不能用于对象(仅限字符串、布尔值等) 在我的例子中,我从 MainActivity 中的列表项启动了一个活动,并希望将用户创建的数据返回到该列表项。在我使用 mContext.startActivity() 的情况下,我无法使用 startActivityForResult()。 @katmanco 示例在这里是一个有用的解决方法。 对我来说这是一次糟糕的选举。存在 actionForResult【参考方案8】:这是你的第一个 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现在这是你的第二个 Activity,名称是 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() 将从那里调用您可以从意图中获取数据..
希望对你有所帮助...:)
【讨论】:
【参考方案9】:TL;DR 使用Activity.startActivityForResult
长答案:
您应该首先阅读 Android 开发者文档。具体而言,Activity
文档的Starting Activities and Getting Results
部分涵盖了您的问题主题。
对于示例代码,Android SDK 提供了很好的示例。此外,此处的其他答案为您提供了简短的示例代码供您使用。
但是,如果您正在寻找替代方案,请阅读this SO question。这是一个很好的讨论,关于如何将startActivityForResults
与片段一起使用,以及在活动之间传递数据的其他几种方法。
【讨论】:
以上是关于按下后如何将数据从第二个活动传递到第一个活动? - 安卓的主要内容,如果未能解决你的问题,请参考以下文章
使用android中的可序列化将对象从第二个活动传递回主要活动
Objective C - 将数据从第二个 VC 与 tableview 传递到第一个 VC
multiprovider - 将值从第一个提供者传递到第二个提供者