方法 getParcelableExtra() 在创建意图时返回 null
Posted
技术标签:
【中文标题】方法 getParcelableExtra() 在创建意图时返回 null【英文标题】:Method getParcelableExtra() returns null when creating an intent 【发布时间】:2018-12-08 14:32:48 【问题描述】:我在创建意图和使用 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 的原因吗?
提前感谢您的帮助!
【问题讨论】:
能否也包含Food
对象? Parcelable 实现中也可能存在问题。
按要求在开篇文章中添加了课程!
包裹的读写顺序要一致。在你的情况下,我希望在writeToParcel()
:dest.writeInt(id); dest.writeString(name);
等......
这解决了我的问题!从没想过订单很重要,因为在回收站视图中它已经起作用了。但当然,我从来没有在那里调用过 .getParcelableExtra。
我将添加一些关于 Parcelable 的参考资料,这样我们就不会留下这个问题没有答案。
【参考方案1】:
正如我上面评论的那样,writeToParcel()
是有问题的。包裹应该按照相同的顺序读写。
请参考以下页面:
What is Parcelable in android
Using Parcelable
Understanding Androids Parcelable - Tutorial
【讨论】:
以上是关于方法 getParcelableExtra() 在创建意图时返回 null的主要内容,如果未能解决你的问题,请参考以下文章
使用 getParcelableExtra() 从不同的活动中获取价值
Android getParcelableExtra传入畸形数据导致APP崩溃Crash复现及原因分析