使用 Intent 时传递数组数据为空

Posted

技术标签:

【中文标题】使用 Intent 时传递数组数据为空【英文标题】:Passing array data is null when using Intent 【发布时间】:2019-10-20 16:05:24 【问题描述】:

我想在 2 个 activity 之间传递一个 arraylist,但我遇到了问题

FirstActivityArrayList 不为空,但在SecondActivity 中为空,我不知道发生了什么

我的意图

Intent intent = new Intent(mContext, NewContactActivity.class);
intent.putParcelableArrayListExtra("CONTACT_ARRAY", mData);
mContext.startActivity(intent);

我的SecondActivity

Intent intent = getIntent();
ArrayList<Contact> lstContact = this.getIntent().getParcelableArrayListExtra("CONTACT_ARRAY");
edtPhone.setText(lstContact.get(0).getPhone());

我的联系班级

public class Contact implements Parcelable 
    private String id;
    private String Name;
    private String Fname;
    private String Phone;
    private String Email;


    public Contact(String id, String Name, String Fname, String Phone, String Email) 
        this.id = id;
        this.Name = Name;
        this.Fname = Fname;
        this.Email = Email;
        this.Phone = Phone;
    

    public Contact(Parcel in) 
        this.id = in.readString();
        this.Name = in.readString();
        this.Fname = in.readString();
        this.Email = in.readString();
        this.Phone = in.readString();
    

    //Getter
    public String getId()  return id; 

    public String getName() 
        return Name;
    

    public String getFname() 
        return Fname;
    

    public String getEmail() 
        return Email;
    

    public String getPhone() 
        return Phone;
    

    //Setter

    public void setName(String name) 
        this.Name = name;
    

    public void setFname(String fname) 
        Fname = fname;
    

    public void setEmail(String email) 
        Email = email;
    

    public void setPhone(String phone) Phone = phone; 

    @Override
    public int describeContents() 
        return 0;
    

    @Override
    public void writeToParcel(Parcel dest, int flags) 
        dest.writeString(id);
        dest.writeString(Name);
        dest.writeString(Fname);
        dest.writeString(Phone);
        dest.writeString(Email);

    
    public static final Parcelable.Creator<Contact> CREATOR = new Parcelable.Creator<Contact>() 
        public Contact createFromParcel(Parcel in)
        
            return new Contact(in);
        
        public Contact[] newArray(int size)
        
            return new Contact[size];
        
    ;

我该如何解决这个问题? 非常感谢

【问题讨论】:

检查您在 SecondActivity 中的类型转换。 你能分享一下如何在列表中添加数据的代码 是的,我正在使用ContentResolverCursor 获取联系人数据到联系人列表 @jasonmomoa 您是否尝试通过查看您通过意图发送的额外数据以及您在其他活动中获得什么来调试此问题?如果没有一个答案有效,你可以试试这个,这对我很有帮助。 @deepakkumar 我试图将一个字符串变量从FirstActivity 传递给SecondActivity,这很完美,但使用ArrayList 不行。 【参考方案1】:

你必须传递数组列表而不是单个对象

ArrayList<Contact> lstContact = createContactList();

i.putParcelableArrayListExtra("CONTACT_ARRAY", (ArrayList) lstContact );

在第二次活动中

 ciArr = (List) i.getParcelableArrayListExtra("CONTACT_ARRAY");

【讨论】:

【参考方案2】:

this.getIntent() 替换为您的intent。你根本没有使用它。

【讨论】:

您确定您的mData 不为空吗?【参考方案3】:

您必须在构造函数和 writeToParcel 函数中保持相同的顺序。

 @Override
public void writeToParcel(Parcel dest, int flags) 
    dest.writeString(id);
    dest.writeString(Name);
    dest.writeString(Fname);
    dest.writeString(Email);
    dest.writeString(Phone);



【讨论】:

【参考方案4】:

试试下面的代码。

private void gotoNextActivity() 
    Intent intent=new Intent(this,NewContactActivity.class);
    Bundle bundle = new Bundle();
    bundle.putParcelableArrayList("CONTACT_ARRAY", contactsList);
    intent.putExtras(bundle);
    startActivity(intent);

NewContactActivity.class

  ArrayList<BeanClass> listFromActivity1=new ArrayList<>(); 
  listFromActivity1=this.getIntent().getExtras().getParcelableArrayList("CONTACT_ARRAY");
  if (listFromActivity1 != null) 
       Log.d("Contact List",""+listFromActivity1.toString());
     

【讨论】:

@@ 不工作,这种方式很好但我不知道为什么它仍然不工作 你能调试看看你的arraylist是否为空吗? 在 FirstActivity 中不为空,但在 SecondActivity 中为空。我不知道发生了什么?

以上是关于使用 Intent 时传递数组数据为空的主要内容,如果未能解决你的问题,请参考以下文章

拍照时意图始终为空

linux字符测试

使用数组传递数据,但在表视图委托中显示为空

解决PendingIntent传递参数为空的问题

java判断字符串是不是为空

ASP.Net将json传递给动作,但服务器端的数据为空