繁体   English   中英

创建意图时,方法getParcelableExtra()返回null

[英]Method getParcelableExtra() returns null when creating an intent

我有一个关于创建意图以及使用getParcelableExtra()方法将对象移交给它的问题。 该项目的目的是创建回收者视图。 如果从回收商中选择了一项,则新的意图将开始,并应显示更多详细数据。

因为数据是从外部MySQL数据库获取的,所以我将Volley用于大多数网络工作。

回收器是在Volley onResponse()方法内部实现的,该方法在应用程序启动时(onCreate)首先调用。 在此之前,一切正常,回收站已正确加载并显示。

public class UserAreaActivity extends AppCompatActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_area);

    initializeRecycler();
}

    public void initializeRecycler() {

    operations.getFoodFromDB(getFoodID(), new IDatabaseOperations() {
        @Override
        public void onSuccess(final ArrayList<Food> food_list) {

            mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
            mLayoutmanager = new LinearLayoutManager(UserAreaActivity.this);
            mAdapter = new FoodAdapter(food_list);
            mRecyclerView.setLayoutManager(mLayoutmanager);
            mRecyclerView.setAdapter(mAdapter);

            mAdapter.setOnItemClickListener(new FoodAdapter.OnItemClickListener() {
                @Override
                public void OnItemClick(int position) {
                    Intent intent = new Intent(UserAreaActivity.this, FoodProfile.class);
 GETS CORRECT OBJECT----->intent.putExtra("food", food_list.get(position));
                    startActivity(intent);
                }
            });

        }
    });

}

}

如您所见,我为Volley onResponse方法创建了一个名为onSuccess的接口。 在此方法中,我正在创建一个onItemClickListener,而这在这里变得很丑陋。 onItemClickListener会打开该项目的更详细视图,但是方法getParcelableExtra()返回NULL。 无论我做什么,都永远不会返回Food类的对象。

public class FoodProfile extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(activity_food_profile);

    Food food = getIntent().getParcelableExtra("food");<----RETURNS NULL 


    String price = food.getPrice();
    String name = food.getName();
    String rating = ((Float)food.getRating()).toString();
    String imageRes = food.getmimgId();


    TextView mPrice = (TextView) findViewById(R.id.Price);
    mPrice.setText(price);
    TextView mName = (TextView) findViewById(R.id.Name);
    mName.setText(name);
    TextView mRating = (TextView) findViewById(R.id.Rating);
    mRating.setText(rating);

}

}

因此,putExtra()可按预期工作,并获得食物类的正确对象。 但是getParcelableExtra()每次都返回NULL。 因此,启动的意图中不会显示任何值。

食品类:

public class Food implements Parcelable {

public int id;
public String name;
public String category;
public String date;
public int vegan;
public int vegetarian;
public String price;
public String uuid;
public float rating;
public String mimgId;

public Food(int id, String name, String category, int vegan, int vegetarian, String price, String uuid, float rating, String mimgId){
    this.id = id;
    this.name = name;
    this.category = category;
    this.date = date;
    this.vegan = vegan;
    this.vegetarian = vegetarian;
    this.price = price;
    this.uuid = uuid;
    this.rating = rating;
    this.mimgId = mimgId;
}

protected Food(Parcel in) {
    id = in.readInt();
    name = in.readString();
    category = in.readString();
    date = in.readString();
    vegan = in.readInt();
    vegetarian = in.readInt();
    price = in.readString();
    uuid = in.readString();
    rating = in.readFloat();
    mimgId = in.readString();
}

public static final Creator<Food> CREATOR = new Creator<Food>() {
    @Override
    public Food createFromParcel(Parcel in) {
        return new Food(in);
    }

    @Override
    public Food[] newArray(int size) {
        return new Food[size];
    }
};

public int getId() {
    return id;
}

public String getName() {
    if(name != null) {
        name = name.replaceAll(System.getProperty("line.separator"), (""));
    }
    return name;
}

public String getDate() {
    return date;
}

public int isVegan() {
    return vegan;
}

public int isVegetarian() {
    return vegetarian;
}

public String getPrice() {
    return price;
}

public String getUuid() {
    return uuid;
}

public float getRating(){return rating;}

public String getmimgId() {
    return mimgId;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(price);
    dest.writeString(name);
    dest.writeString(((Float)rating).toString());
    dest.writeString(mimgId);

}
}

有谁知道是什么导致getParcelableExtra()返回null?

谢谢您的帮助!

正如我上面评论的, writeToParcel()有问题。 包裹的书写和读取顺序应相同。

请参考以下页面:

Android中的Parcelable是什么

使用包裹式

了解Androids Parcelable-教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM