我对一个我似乎无法完全理解的问题感到有些沮丧。
我有一个包含项目的列表视图,当我点击它们时,我想将一个对象(Parcelable)传递给一个新活动。这是下面的代码:
lv_Entries.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent getItchesScreen = new Intent(Home.this, Itches.class);
getItchesScreen.putExtra("i", 3);
Entry e = entries.get(position);
getItchesScreen.putExtra("entry", e);
startActivity(getItchesScreen);
}
});
现在,我有了#34;我&#34;额外用于调试目的。我刚刚发送&#34; entry&#34;当我对活动有意图时,它没有工作。代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_itches);
tv_date = (TextView) findViewById(R.id.tv_date);
Bundle b = getIntent().getExtras();
entry = b.getParcelable("entry");
tv_date.setText(entry.getDate());
itches = entry.getItches();
itchesAdapter = new ItchAdapter(this, itches);
ListView lv_Itches = (ListView) findViewById(R.id.lv_itches);
lv_Itches.setAdapter(itchesAdapter);
}
因此,当我阅读我的包时,根本没有任何东西。没有&#34;进入&#34;钥匙,没有&#34;我&#34;键(我调试使用手表功能阅读i)
BUT!如果我不发送&#34;条目&#34;并且只发送&#34; i&#34;我调试以赶上&#34;我&#34;我明白了!
我不知道为什么发送条目会破坏事情,但我找不到任何答案。我调试了对象,它确实找到了.get(position)。
希望任何人都能给我任何想法,并为任何麻烦感到抱歉。
修改的
以下是Entry的代码:
public class Entry implements Parcelable{
private String date;
private ArrayList<Itch> itches;
public Entry(String date){
this.date = date;
itches = new ArrayList<Itch>();
}
// PARCELABLE
public Entry(Parcel source){
date = source.readString();
source.readTypedList(itches, Itch.CREATOR);
}
public void AddItch(Itch itch){
itches.add(itch);
}
// get intensity average for the itches
public int IntensityAverage(){
int intensity = 0;
for(Itch i : itches){
intensity += i.getIntensity();
}
return intensity/itches.size();
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public ArrayList<Itch> getItches() {
return itches;
}
public void setItches(ArrayList<Itch> itches) {
this.itches = itches;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(date);
dest.writeTypedList(itches);
}
public static final Parcelable.Creator<Entry> CREATOR =
new Parcelable.Creator<Entry>() {
public Entry createFromParcel(Parcel source) {
return new Entry(source);
}
public Entry[] newArray(int size) {
return new Entry[size];
}
};
}
Itch类也是Parceable。我正确填充了ListView(至少没有在Android上崩溃)。
为方便起见,我将代码放在这里:
public class Itch implements Parcelable{
private String time;
private String local;
private int intensity;
public Itch(String time, String local, int intensity){
this.time = time;
this.local = local;
this.intensity = intensity;
}
// PARCELABLE
public Itch(Parcel source){
time = source.readString();
local = source.readString();
intensity = source.readInt();
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getLocal() {
return local;
}
public void setLocal(String local) {
this.local = local;
}
public int getIntensity() {
return intensity;
}
public void setIntensity(int intensity) {
this.intensity = intensity;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(time);
dest.writeString(local);
dest.writeInt(intensity);
}
public static final Parcelable.Creator<Itch> CREATOR =
new Parcelable.Creator<Itch>() {
public Itch createFromParcel(Parcel source) {
return new Itch(source);
}
public Itch[] newArray(int size) {
return new Itch[size];
}
};
}
答案 0 :(得分:3)
好吧......问题是什么?简单。
parcelable总是出现null的原因是因为发生了一个愚蠢的错误。哪个错误?
好吧,好吧,看看这段代码:
entry = b.getParcelable("entry");
这是什么意思?据说,参赛作品将等于可以参加的参赛作品#34;键。但这究竟意味着什么?查看入口构造函数。
// PARCELABLE
public Entry(Parcel source){
date = source.readString();
source.readTypedList(itches, Itch.CREATOR);
}
因此,当您说条目等于parcelable时,您将在我发布的Entry类中调用此构造函数。但为什么你可能会问这个错误呢?
嗯,好好看看。我们将ArrayList itches赋予方法readTypeList。但是......等一下。如果那是一个构造函数,意味着我们从0开始构建...那么...是否已启动?不它不是!因为我只是在&#34;正常&#34;构造!public Entry(String date){
this.date = date;
itches = new ArrayList<Itch>();
}
所以解决方案是......
// PARCELABLE
public Entry(Parcel source){
date = source.readString();
//add this if condition!
if (itches == null) {
itches = new ArrayList<Itch>();
}
source.readTypedList(itches, Itch.CREATOR);
}
就是这样。这解决了我们的问题! :)
如果发生其他错误,请注意: 确保您的密钥正确无误。因此,请查看您获得额外内容的任何拼写错误。
entry = b.getParcelable("entyr");
代替
entry = b.getParcelable("entry");
还有其他任何类型的错误。
这不是一个好的实践,你应该有一个变量,其中包含&#34;条目&#34;写在上面,所以你永远不会有这种类型的错误。我在我的代码中有它,因为我正在快速编程以构建原型:)
快乐的编码!
答案 1 :(得分:-1)
您是否尝试在onCreate()
Intent i = getIntent();
if(i.hasExtra("entry")){
entry = i.getParcelableExtra("entry");
}else{
Log.v("EXTRAS", "entry not found");
}