题
如何将值从一个屏幕传递到其上一个屏幕?
考虑这种情况:我有两项活动。第一个屏幕有一个 TextView
和一个按钮,第二个活动有一个 EditText
和一个按钮。
如果我单击第一个按钮,那么它必须移动到第二个活动,并且用户必须在文本框中输入一些内容。如果他从第二个屏幕按下按钮,则文本框中的值应移动到第一个活动,并且应显示在第一个活动中 TextView
.
解决方案
要捕捉内另一个活动执行的操作需要三个步骤。
通过使用startActivityForResult
从主活动启动次级活动(“编辑文本”活动),为子活动。
Intent i = new Intent(this,TextEntryActivity.class);
startActivityForResult(i, STATIC_INTEGER_VALUE);
在子活动,而不仅仅是关闭活动,当用户点击该按钮,你需要创建一个新的意图,并作为其额外捆绑输入的文本值。将它传递回父呼叫setResult
主叫finish
以关闭辅助活动之前。
Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();
最后一步是在呼叫的活动:覆盖onActivityResult
以监听来自文本输入活动回调。从返回的意图获取额外得到你应该显示文本值。
@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;
}
}
}
其他提示
您可以通过多种方式访问其他类或活动中的变量或对象。
A。数据库
B.共同的偏好。
C。对象序列化。
D .可以保存通用数据的类可以命名为 Common Utilities,这取决于您。
E.通过 Intents 和 Parcelable Interface 传递数据。
这取决于您的项目需求。
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。 对象序列化
如果我们想要保存对象状态以通过网络发送它,则使用对象序列化,或者您也可以将其用于您的目的。
使用 java beans 并将其存储为他的字段之一,并为此使用 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
D . 公用事业
您可以自己创建一个类,其中包含您项目中经常需要的常用数据。
样本
public class CommonUtilities {
public static String className = "CommonUtilities";
}
E. 通过 Intent 传递数据
有关传递数据的选项,请参阅本教程。
你没有..
刚刚从第二活动调用newIntenet()
Intent retData=new Intent();
添加数据传递回
putExtras (retData.putExtra("userName", getUsrName()));
前进用的setResult
setResult(RESULT_OK, retData);
和然后可以完成
finish();
<强> startActivityForResult()强>
这是从SDK中包含更多信息的链接:
http://developer.android.com/guide/appendix /faq/commontasks.html#opennewscreen
和向下滚动到标题为“从一个屏幕返回结果”的部分
我经常使用静态变量与静态setter方法调用活动来设置它们。
在这种方式我可以在随意的任何活动变化值,而不管各种活动之间的控制的精确流量。
请注意,如果你不关心这一招只能用 的应用程序中的相同的活性(类)的多于一个拷贝的实例化, 但我发现这是最容易实现的,我用它最。
在这里做的最佳方法是把变量,其范围之外限定的公共类
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);
的代码内
@覆盖 公共无效onActivityResult(INT requestCode,INT发送resultCode,意图数据) { 如果(requestCode == Keys.PICK_CONTACT) { 如果(resultCode为== Activity.RESULT_OK) { URI联系数据= data.getData();
//you may use the variable here after intent result
LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....