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


97

如何将值从一个屏幕传递到其前一个屏幕?

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

如果我单击第一个按钮,则它必须移至第二个活动,并且此处用户必须在文本框中键入某些内容。如果他从第二个屏幕中按下按钮,则文本框中的值应移至第一个活动,并应在第一个活动中显示TextView



Answers:


240

要捕获对另一个活动中的一个活动执行的操作,需要三个步骤。

通过使用startActivityForResult主活动中的子活动来启动辅助活动(您的“编辑文本”活动)作为子活动。

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

在子活动中,您不仅需要在用户单击按钮时关闭活动,还需要创建一个新的Intent,并将输入的文本值包含在其Extras包中。setResult在调用finish以关闭辅助活动之前将其传递回父调用。

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

最后一步是在调用Activity:重写onActivityResult以侦听来自文本条目Activity的回调。从返回的Intent中获取更多信息,以获取您应显示的文本值。

@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();
理查德·廷格

1
还值得注意的是,这仅在相同的上下文中有效。例如,如果您从一个片段开始活动,则该活动将无法正常工作,因为requestCode每次都会有所不同。您需要在片段中使用getActivity()。startActivityForResult()。
斯蒂夫,

10

您可以通过几种方法访问其他类或Activity中的变量或对象。

A.数据库

B.共享首选项。

C.对象序列化。

D.可以保存公共数据的类可以命名为Common Utilities,它取决于您。

E.通过意图和可打包接口传递数据。

这取决于您的项目需求。

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()可以保存所需的dtatype。

如何取得

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

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

C. 对象序列化

如果我们要保存对象状态以通过网络发送它,或者您也可以将其用于您的目的,则使用对象序列化。

使用Java bean并将其存储在他的字段中,并为此使用getter和setter

JavaBean是具有属性的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);

然后使用对象Serialzation序列化此对象,并在其他类中反序列化此对象。

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

将序列化的对象写入文件后,可以从文件中读取并反序列化该对象,即表示对象及其数据的类型信息和字节可用于在内存中重新创建对象。

如果您要使用此教程,请参考此链接

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

获取其他类中的变量

D. 公用事业

您可以自己创建一个类,其中可以包含项目中经常需要的通用数据。

样品

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


2

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

这样,无论各种活动之间的确切控制流程如何,我都可以随意更改任何活动中的值。

请注意,仅当您不关心在应用程序中实例化同一活动(类)的多个副本时,才可以使用此技巧,但我发现这是最容易实现的,并且我使用得最多。


不是一个很好的解决方案。这违反了Android的最佳做法。您不能保证活动不会被杀死并且系统不会启动新实例。
法拉尔爵士

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);
....
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.