如何将一个活动的值传递给之前的活动
我如何将一个屏幕的值传递到其前一个屏幕?
考虑这种情况:我有两个活动。 第一个屏幕有一个TextView
和一个button,第二个活动有一个EditText
和一个button。
如果我点击第一个button,那么它必须移动到第二个活动,这里用户必须在文本框中键入一些东西。 如果他从第二个屏幕按下button,那么文本框中的值应该移到第一个活动,并且应该显示在第一个活动TextView
。
捕获在另一个活动中执行的动作需要三个步骤。
通过使用主活动中的startActivityForResult
启动辅助活动(您的“编辑文本”活动)作为子活动。
Intent i = new Intent(this,TextEntryActivity.class); startActivityForResult(i, STATIC_INTEGER_VALUE);
在子活动中,当用户单击button时,不需要closures活动,而是需要创build一个新的Intent,并将input的文本值包含在其extras包中。 在调用finish
closures第二个Activity之前,将它传回给父调用setResult
。
resultIntent = new Intent(null); resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue); setResult(Activity.RESULT_OK, resultIntent); finish();
最后一步是在调用Activity中,重写onActivityResult
来监听来自文本条目Activity的callback。 从返回的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; } } }
有几种方法可以访问其他类或Activity中的variables或对象。
A.数据库
B.共享喜好。
C.对象序列化。
D.一个能容纳普通数据的类可以被命名为Common Utilities它取决于你。
E.通过Intents和Parcelable接口传递数据。
这取决于你的项目需求。
A. 数据库
SQLite是embedded到Android的开源数据库。 SQLite支持标准的关系数据库function,如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. 对象序列化
如果我们想要保存一个对象状态来通过networking发送它,或者你也可以使用它,你也可以使用对象serlization。
使用java bean并将其作为其中一个字段存储,并为此使用getter和setter
JavaBeans是具有属性的Java类。 将属性看作私有实例variables。 由于他们是私人的,所以他们可以从课外访问的唯一途径就是通过课堂上的方法。 更改属性值的方法称为setter方法,检索属性值的方法称为getter方法。
public class VariableStorage implements Serializable { private String inString ; public String getInString() { return inString; } public void setInString(String inString) { this.inString = inString; } }
通过使用在邮件方法中设置variables
VariableStorage variableStorage = new VariableStorage(); variableStorage.setInString(inString);
然后使用对象Serialzation序列化这个对象,并在你的其他类反序列化这个对象。
在序列化过程中,一个对象可以表示为一个包含对象数据的字节序列,以及关于对象types和存储在对象中的数据types的信息。
序列化对象写入文件后,可以从文件中读取并反序列化,即可以使用表示对象及其数据的types信息和字节来重新创build内存中的对象。
如果你想要这个教程,请参考这个链接
http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html
在其他类中获取variables
D.共同事业
你可以通过自己创build一个能包含你在项目中经常需要的常用数据的类。
样品
public class CommonUtilities { public static String className = "CommonUtilities"; }
E. 通过意图传递数据
请参阅本教程以获取传递数据的选项。
你不必..
只需从第二个活动调用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方法在调用活动中使用静态variables来设置它们。
通过这种方式,我可以随意更改任何活动的价值,而不pipe各种活动之间的确切stream程。
注意,这个技巧只有在你不关心应用程序中同一活动(类)的多个副本的实例化时才能使用,但是我发现这是最容易实现的,而且我最多使用它。
这里最好的办法是把variables放到一个在范围外定义的公共类中
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); ....