Android:在活动之间传递哈希映射
我有一个string和类对象之间的映射。 我在Activity1中填充这个地图,我想把它传递给activity2。
public class NEW extends Activity { public class data { String name; float value; .... etc } ...... static Map<String, data> data_map = new HashMap<String, data>(); ..... }
我假设你拥有两个活动(称他们为A和B)。 在这种情况下,只需将地图放在一个公共静态variables中,并通过A.data_map从B中访问它。
[更新]
对于所有downvotes,请仔细阅读Android应用程序框架FAQ部分“如何在单个应用程序内的活动/服务之间传递数据?”。 我推荐的解决scheme与…完全一样
公共静态字段/方法
使活动/服务可访问数据的另一种方法是使用公共静态字段和/或方法。 您可以从应用程序中的任何其他类访问这些静态字段。 要共享一个对象,创build对象的活动设置一个静态字段来指向这个对象,任何其他想要使用这个对象的活动都只是访问这个静态字段。
是的,这个解决scheme有一些注意事项,但是由于OP提供的信息有限,我们不能假定这种方法是行不通的。
要做到这一点,最好的方法是如果你可以在Bundle所支持的原语中expression你的数据,那么它可以放在你通过Intent.putExtra()方法发送的Intent中。 (除了使用Serializable,这是非常缓慢和低效的。)
但是,您不能这样做,因为(a)您正在使用地图,(b)您的地图包含自定义数据types。
正确地解决这个问题的正确方法是编写一个自定义的Parcellable类,负责编组/解组数据结构。 我将在这里勾画出这个代码,虽然它可能不完全正确:
import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable.Creator; public class MyData implements Parcelable { HashMap<String, data> data_map = new HashMap<String, data>(); public MyData() { } public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int parcelableFlags) { final int N = data_map.size(); dest.writeInt(N); if (N > 0) { for (Map.Entry<String, data> entry : data_map.entrySet()) { dest.writeString(entry.getKey()); data dat = entry.getValue(); dest.writeString(dat.name); dest.writeFloat(dat.value); // etc... } } } public static final Creator<MyData> CREATOR = new Creator<MyData>() { public MyData createFromParcel(Parcel source) { return new MyData(source); } public MyData[] newArray(int size) { return new MyData[size]; } }; private MyData(Parcel source) { final int N = source.readInt(); for (int i=0; i<N; i++) { String key = source.readString(); data dat = new data(); dat.name = source.readString(); dat.value = source.readFloat(); // etc... data_map.put(key, dat); } } }
请注意,如果您有像“data”类这样的自定义数据结构,那么也可以使得Parcellable更清晰,因此它知道如何在Parcel中读取/写入其内容,并且此处的代码只会调用.writeToParcel …)和一个.readFromParcel(…)方法,而不知道其内容的细节。 这样,当你添加新的字段到“数据”,你不会忘记也更新这个其他编组代码,以了解他们。
我会build议使用Intents,它既适用于静态对象也适用于任意对象(只要它们实现Serializable)。 为你的应用程序创build一个自定义的Intent ,然后把你的HashMap(不是一个没有实现Serializable的Map)作为额外的数据传递给它:
Intent act2 = new Intent(Activity2.SHOW_ME); act2.putExtra("data", data_map);
然后在Activity2中,可以调用getIntent()
并通过Intent.getAction().equals(Activity2.SHOW_ME)
是否是调用Activity的人。 如果是这样,您可以通过访问您的额外数据
Intent caller = getIntent(); if (caller.getAction().equals(Activity2.SHOW_ME)) { Map<String, NEW.data> data_map = (Map<String, NEW.data>)caller.getExtras().get("data"); }
希望我input正确的一切;)这假定,你的意图行动string存储为static final string SHOW_ME = "yourpackage.yourname";
在Activity2中。
如果您需要进一步澄清,请添加评论。
您可以将数据封装在绑定服务中,如本文档中所述:
http://developer.android.com/guide/topics/fundamentals/bound-services.html
不要忘记将您的服务器添加到清单文件。
这个解决scheme的优点是从您的用户界面解耦您的数据,这将最终导致更可维护的devise。
如果需要出现,您可以添加一个消息包装到您的服务的API,以允许从其他进程/应用程序调用它
创build一个新的Java文件,这将是整个应用程序的全局。
第一步 :
public class GlobalClass extends android.app.Application { public static Map<String, NEW.data> data_map = new Map<String, NEW.data>(); }
第二步 :
完成之后,在AndroidManifest.xml中注册这个“GlobalClass”
<application android:name=".GlobalClass" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > </application>
第三步 :
现在,您可以在应用程序的任何位置使用此Map。
@Override protected void onCreate(Bundle icicle) { GlobalClass global = (GlobalClass)getApplication(); Map<String, NEW.data> my_map_data = global.data_map; }
这些步骤可能对你有帮助…