如何将值从一个活动传递到上一个活动

103

如何将一个页面的数据传递到前一个页面?

考虑这种情况:有两个活动。第一个屏幕包含一个 TextView 和一个按钮,第二个活动包含一个EditText和一个按钮。

如果我点击第一个按钮,则必须移动到第二个活动,并在此处要求用户在文本框中输入内容。如果用户从第二个屏幕按下按钮,则应该将文本框中的值移回到第一个活动,并在第一个活动的TextView中显示。


6个回答

247

要在一个Activity中捕获另一个Activity执行的操作需要三个步骤。

使用startActivityForResult从您的主Activity启动辅助Activity(即“Edit Text” Activity)作为子Activity。

Intent i = new Intent(this,TextEntryActivity.class);    
startActivityForResult(i, STATIC_INTEGER_VALUE);

在子活动中,不能仅在用户单击按钮时关闭活动,而需要创建一个新的Intent并在其额外捆绑包中包含输入的文本值。要将它传递回父级,请在调用finish关闭次级活动之前调用setResult

Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();

最后一步在调用的Activity中:重写onActivityResult方法以监听来自文本输入Activity的回调。从返回的Intent中获取extra以获取应显示的文本值。

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) {     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) { 
    case (STATIC_INTEGER_VALUE) : { 
      if (resultCode == Activity.RESULT_OK) { 
      String newText = data.getStringExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
      // TODO Update your TextView.
      } 
      break; 
    } 
  } 
} 

27
除了 new Intent(null); 外,其他都可以正常工作。因为这个语句“太模棱两可”了,所以我不得不将其更改为 new Intent(); - Richard Tingle
1
值得注意的是,这仅适用于相同的上下文环境。例如,如果您从片段开始活动,则不起作用,因为每次requestCode都会不同。您需要在片段中使用getActivity().startActivityForResult()。 - stef
Reto - 你介意看一下我最近关于类似情况的问题吗? - Bryan Potts

10

有几种方法可以访问其他类或活动中的变量或对象。

A. 数据库

B. 共享首选项。

C. 对象序列化。

D. 可以将通用数据保存在称为公共实用程序的类中,具体取决于您。

E. 通过意向和Parcelable接口传递数据。

这取决于您的项目需求。

A. 数据库

SQLite是嵌入到Android中的开源数据库。 SQLite支持标准关系型数据库功能,如SQL语法,事务和预编译语句。

教程-- http://www.vogella.com/articles/AndroidSQLite/article.html

B. 共享首选项

假设您想存储用户名。那么现在将有两个东西,一个用户名,一个值。

如何存储

 // Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

使用putString()、putBoolean()、putInt()、putFloat()、putLong()方法,您可以保存所需的数据类型。

如何获取

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

C. 对象序列化

如果想把一个对象状态保存下来并在网络上传输,或者出于其他目的,可以使用对象序列化。

使用JavaBeans将其存储为一个字段,并使用getter和setter进行访问。

JavaBeans是具有属性的Java类。将属性视为私有实例变量。由于它们是私有的,因此它们只能通过类中的方法从外部访问。更改属性值的方法称为setter方法,检索属性值的方法称为getter方法。

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

通过使用方法在您的邮件中设置变量。

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

然后使用对象序列化将此对象序列化,然后在您的其他类中反序列化此对象。

在序列化中,一个对象可以被表示为字节序列,其中包括对象的数据以及关于对象类型和存储在对象中的数据类型的信息。

将序列化的对象写入文件后,可以从文件中读取并进行反序列化,也就是说,可以使用表示对象及其数据的字节和类型信息来重新创建内存中的对象。

如果您想要此教程,请参阅此链接

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

获取其他类中的变量

D. CommonUtilities

您可以自己编写一个类,其中包含您在项目中经常需要的公共数据。

示例

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. 通过意图传递数据

请参考本教程中关于这个选项的数据传递部分。

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/


6

您不必...

只需从第二个活动中调用newIntent()函数即可。

Intent retData=new Intent();

添加数据以传回
putExtras (retData.putExtra("userName", getUsrName()));

继续使用setResult

setResult(RESULT_OK, retData);

然后便可以完成

finish();

4

startActivityForResult()

这是一个用于启动新的屏幕并等待返回结果的方法。在Android开发中,我们可以使用它来打开另一个屏幕并获取该屏幕返回的数据。

以下是SDK中提供更多信息的链接:

http://developer.android.com/guide/appendix/faq/commontasks.html#opennewscreen

请向下滚动到标题为“从屏幕返回结果”的部分。


2

我经常在调用活动中使用静态变量和静态setter方法来设置它们。

通过这种方式,我可以随意更改任何活动中的值,而不管各个活动之间的具体控制流。

请注意,此技巧仅适用于您不关心应用程序中实例化多个相同活动(类)的情况,但是我发现这是最容易实现的方法,并且我使用它最多。


不是一个好的解决方案。这与 Android 的最佳实践相违背。你无法保证一个 Activity 不会被系统杀掉并重新启动一个新的实例。 - SIr Codealot

0
最好的方法是将变量放到一个在作用域之外定义的公共类中。
public class Utils 
{
    public static String mPosition;
}

在你的代码中(例如:OnButtonClick等...)

Intent intent = new Intent(Intent.ACTION_PICK, 
ContactsContract.Contacts.CONTENT_URI);
Utils.mPosition = mViewData.mPosition + "";
LogHelper.e(TAG, "before intent: " + Utils.mPosition);
startActivityForResult(intent, Keys.PICK_CONTACT);

代码内部:

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == Keys.PICK_CONTACT) { if (resultCode == Activity.RESULT_OK) { Uri contactData = data.getData();

            //you may use the variable here after intent result
            LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接