102

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

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

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

4

6 回答 6

247

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

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

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

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

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

最后一步是在调用 Activity:OverrideonActivityResult以侦听来自文本输入 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; 
    } 
  } 
} 
于 2009-07-14T12:14:00.770 回答
10

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

A. 数据库

B. 共享偏好。

C. 对象序列化。

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

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

这取决于您的项目需求。

A.数据库

SQLite 是一个嵌入到 Android 中的开源数据库。SQLite 支持标准的关系数据库功能,如 SQL 语法、事务和准备好的语句。

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

B.共同偏好

假设您要存储用户名。所以现在会有两件事,一个Key Username,一个Value Value。

如何储存

 // 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.对象序列化

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

使用 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);

然后使用对象序列化来序列化这个对象,并在你的其他类中反序列化这个对象。

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

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

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

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

获取其他类中的变量

D. CommonUtilities

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

样本

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E.通过 Intent 传递数据

请参阅本教程以了解此传递数据的选项。

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

于 2013-06-25T20:15:58.140 回答
6

你不必...

只需从第二个活动中调用 newIntent()

Intent retData=new Intent();

添加数据以传回

putExtras (retData.putExtra("userName", getUsrName()));

继续使用 setResult

setResult(RESULT_OK, retData);

然后可以完成

finish();
于 2011-02-20T08:25:53.993 回答
4

startActivityForResult()

这是来自 SDK 的链接,其中包含更多信息:

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

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

于 2009-07-14T11:11:46.430 回答
2

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

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

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

于 2011-05-19T06:56:28.943 回答
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);
....
于 2017-11-14T11:34:39.057 回答