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

Posted

技术标签:

【中文标题】如何将值从一个活动传递到上一个活动【英文标题】:How to pass the values from one activity to previous activity 【发布时间】:2010-11-10 14:33:23 【问题描述】:

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

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

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

【问题讨论】:

Sending data back to the Main Activity in android的可能重复 How do I pass data between Activities in Android application?的可能重复 【参考方案1】:

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

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

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

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

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; 
     
   
 

【讨论】:

这一切都对我有用,除了 new Intent(null);“太模糊”,我不得不将其更改为 new Intent(); 同样值得注意的是,这只会在相同的上下文中起作用。例如,如果您从片段开始活动,它将无法工作,因为请求代码每次都会不同。您需要在片段中使用 getActivity().startActivityForResult()。 Reto - 你介意看看我最近关于类似情况的问题吗?【参考方案2】:

您可以通过多种方式访问​​其他类或 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用户名,ValueValue。

如何储存

 // 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://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

Get variable in other classes

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/

【讨论】:

【参考方案3】:

你不必...

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

Intent retData=new Intent();

添加要传回的数据

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

继续使用 setResult

setResult(RESULT_OK, retData);

然后就可以结束了

finish();

【讨论】:

【参考方案4】:

startActivityForResult()

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

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

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

【讨论】:

【参考方案5】:

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

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

请注意,只有在您不关心 在应用程序中实例化多个相同活动(类)的副本, 但我发现这是最容易实现的,而且我用得最多。

【讨论】:

不是一个很好的解决方案。这违背了 Android 的最佳实践。你不能保证一个活动不会被杀死并且系统会启动一个新实例。【参考方案6】:

这里最好的方法是把变量放到一个在作用域外定义的公共类中

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

里面的代码

@覆盖 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);
....

【讨论】:

以上是关于如何将值从一个活动传递到上一个活动的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从动态列表视图传递到活动?

如何将值从其他活动传递给 viewpager 片段?

通过 AsyncTask 将值从第一个活动传递到第三个活动

如何将值从片段/活动传递到 xml?

如何将值从活动传递到 Android Studio 中的类?

如何将值从基本适配器传递到 Android 中的 Activity