方法 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复现及原因分析

Android getParcelableExtra传入畸形数据导致APP崩溃Crash复现及原因分析

如何从 IsoDep 获取额外的卡数据?

写入单块命令会因NfcV失败

android bean 中含有bitmap 怎么用过intent传递