EXTRA with parcelable comes out NULL but without i

2019-10-20 14:05发布

我正在与我似乎无法完全理解的问题有点沮丧。

我有一个项目列表视图,当我点击他们,我想一个对象(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);
        }
    });

现在,我有调试目的的“我”额外那里。 我只是送“进入”,当我上了活动的意图没有奏效。 下面的代码:

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);
}

所以,当我看到我的包没有什么可言。 没有“进入”键,并没有“I”键(我调试我使用监视功能来读取)

但! 如果我不发送“进入”和只发送“i”和我调试赶上“我”我不明白!

我不知道为什么发送条目被破坏的事情,但我找不到任何答案。 我调试的对象,它发现它虽然获得(位置)。

希望任何人都可以给我任何的想法,对不起任何麻烦。

编辑

下面是输入的代码:

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];
        }
    };

}

瘙痒类也是Parceable。 我填充正确(无至少在Android崩溃)与它的ListView控件。

为了方便起见,我把这里藏汉代码:

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];
        }
    };

}

Answer 1:

好吧所以......是什么问题? 简单。

为什么总是parcelable出来无效的原因是因为一个愚蠢的错误发生在。 这错误?

好了,好了,所以来看看这段代码:

entry = b.getParcelable("entry");

它是什么意思吗? 这是说,项目将等于parcelable“进入”键。 但到底是什么究竟意味着什么? 看看进入构造函数。

// PARCELABLE
public Entry(Parcel source){
    date = source.readString();
    source.readTypedList(itches, Itch.CREATOR);
}

所以,当你说条目是等于一个parcelable,那么你将调用此构造中,我已经发布了入门级。 但为什么错了,你可能会问?

好了,所以来看看。 我们给的ArrayList痒的方法readTypeList。 但是......等一下。 如果是这意味着我们从0建筑构造是这样......是痒启动? 不它不是! 因为我只发起了“正常”的构造痒!

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");

和任何其他类型的类似错误。

这不是一个很好的实践的研究,你应该有一个具有“入口”写上,所以你永远不会有这种类型的错误错误的变量。 我有它在我的代码,因为我快编程建立一个原型:)

编码愉快!



Answer 2:

你有没有尝试过这样做onCreate()

Intent i = getIntent();
    if(i.hasExtra("entry")){
        entry = i.getParcelableExtra("entry");
    }else{
      Log.v("EXTRAS", "entry not found");
    }


文章来源: EXTRA with parcelable comes out NULL but without its fine