如何将值从一个屏幕传递到上一个屏幕?
考虑这种情况:我有两个活动。第一个屏幕有一个TextView
和一个按钮,第二个活动有一个EditText
和一个按钮。
如果我单击第一个按钮,则必须移至第二个活动,此处用户必须在文本框中键入内容。如果他按下第二个屏幕上的按钮,则文本框中的值应移至第一个活动,并且应显示在第一个活动TextView
中。
答案 0 :(得分:226)
要捕获对另一个活动执行的操作,需要三个步骤。
使用主要活动中的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:Override 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;
}
}
}
答案 1 :(得分:10)
您可以通过多种方式访问其他类或Activity中的变量或对象。
一个。数据库
B中。共享偏好。
℃。对象序列化。
d。可以保存公共数据的类可以命名为依赖于您的Common Utilities。
电子。通过Intents和Parcelable Interface传递数据。
这取决于您的项目需求。
一个。的数据库强>
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
℃。 对象序列化
如果我们想要保存对象状态以通过网络发送它,或者您也可以将它用于您的目的,则使用对象serlization。
使用java bean并将其存储为其中一个字段,并使用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";
}
电子。 通过意图传递数据
请参阅本教程以了解传递数据的选项。
答案 2 :(得分:5)
你没有......
从第二个活动中调用newIntenet()
Intent retData=new Intent();
添加数据以传回
putExtras (retData.putExtra("userName", getUsrName()));
继续使用setResult
setResult(RESULT_OK, retData);
然后可以完成
finish();
答案 3 :(得分:4)
<强> startActivityForResult()强>
以下是来自SDK的链接以及更多信息:
http://developer.android.com/guide/appendix/faq/commontasks.html#opennewscreen
并向下滚动到标题为“从屏幕返回结果”的部分
答案 4 :(得分:2)
我经常在调用活动中使用静态变量和静态setter方法来设置它们。
通过这种方式,无论各种活动之间的确切控制流程如何,我都可以随意更改任何活动中的值。
请注意,只有在您不关心的情况下才能使用此技巧 在应用程序中实例化同一个活动(类)的多个副本, 但我发现这是最容易实现的,我最常使用它。
答案 5 :(得分: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);
代码内的
@覆盖 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);
....