我喜欢从另一个活动中传递来自一个活动的对象。我实现了Serializable。 但不知何故,对象没有传递,在接收器端我得到NULL。 可以检查哪里出错了吗?
public class TrackerInfo implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
String Idnumber;
String Simcardnumber;
String Description;
String Model;
String time;
public String getSimcardnumber() {
return Simcardnumber;
}
public String getDescription() {
return Description;
}
public String getModel() {
return Model;
}
public void setModel(String model) {
this.Model = model;
}
public String getTime() {
return time;
}
public void setInforFromCursor(Cursor cursor){
this.Idnumber = cursor.getString(1);
this.Simcardnumber = cursor.getString(2);
this.Description = cursor.getString(3);
this.Model = cursor.getString(4);
this.time = cursor.getString(5);
}}
在发件人方面,
@Override
public void itemSelected(String id) {
//get Tracker info
dbHelper = new TrackerDBAdapter(this);
dbHelper.open();
Cursor cursor = dbHelper.fetchListByIDNum(id);
TrackerInfo tracker = new TrackerInfo();
tracker.setInforFromCursor(cursor);
dbHelper.close();
LinkedHashMap<String, Object> obj = new LinkedHashMap<String, Object>();
obj.put("TRAKCER", tracker);
Bundle b = new Bundle();
b.putSerializable("bundleobj", obj);
Intent intent = new Intent(this, DetailMapView.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("bundleobj", b);
startActivity(intent);
}
在接收方,
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_detail_map_view);
try { setContentView(R.layout.activity_detail_map_view);
Bundle bn = new Bundle();
bn = getIntent().getExtras();
HashMap<String, Object> getobj = new HashMap<String, Object>();
getobj = (HashMap<String, Object>) bn.getSerializable("bundleobj");
trackerinfo = (TrackerInfo) getobj.get("TRACKER");
} catch (Exception e) {
Log.e("Err", e.getMessage());
}}
答案 0 :(得分:2)
我认为你的问题就在这里:
obj.put("TRAKCER", tracker);
您正在使用密钥 HashMap
TRAKCER
添加跟踪器
但是在这里:
getobj.get("TRACKER");
您正在尝试使用键 TRACKER
获取对象,但键不相等,这是 NPE
的原因。你需要修复
obj.put("TRACKER", tracker);
现在键是相同的,所以它应该有效。
正如@Sam指出的那样,你将HashMap
包装成Bundle和Bundle成为Intent。因此,如果您的方法有效,您需要执行以下操作:
LinkedHashMap<String, Object> obj = new LinkedHashMap<String, Object>();
obj.put("TRACKER", tracker);
Bundle b = new Bundle();
b.putSerializable("trackerObj", obj);
Intent intent = new Intent(this, DetailMapView.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("bundleObj", b);
用于检索HashMap
:
Bundle wrapper = getIntent().getBundleExtra("bundleObj"); // this Bundle contains HashMap
HashMap<String, Object> obj = (HashMap<String, Object>) wrapper.getSerializable("trackerObj");
@Sam如何再次指出,更好更清洁的方法是将HashMap
作为Serializable直接包装到Intent中,并使用putExtra("trackerObj", obj)
方法,然后轻松将其检索为
HashMap<String, Object> o = (HashMap<String, Object>) getIntent().getSerializableExtra("trackerObj");
答案 1 :(得分:1)
你有一些错误,请阅读Sajmon的answer,但是你也要把Bundle放在一个Bundle中,但只能从外面的Bundle中读取。删除如下代码:
Bundle b = new Bundle();
b.putSerializable("bundleobj", obj);
击> <击> 撞击>
将数据直接放入Intent:
Intent intent = new Intent(this, DetailMapView.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("bundleobj", obj);
// You may need to help the compiler by casting it to a Serializable
//intent.putExtra("bundleobj", (Serializable) obj);
要使用双Bundle方法,您需要同时获取“bundobj”标签:
bn = getIntent().getExtras().getBundle("bundleobj");
HashMap<String, Object> getobj = (HashMap<String, Object>) bn.getSerializable("bundleobj");