Android Studio中如何用Intent传递数组?求助数据接收失败问题
如何通过Intent传递数组/ArrayList?
我来帮你搞定这两个问题,先从基础的传递方法说起,再针对你的ArrayList传递失败的情况排查可能的原因。
一、不同类型数组/ArrayList的传递方式
1. 基本类型数组(比如int[]、String[])
这种最简单,Intent本身就提供了对应的重载方法:
传递代码(第一个Activity):
Intent intent = new Intent(FirstActivity.this, SecondActivity.class); // 传递int数组 int[] numArray = {10, 20, 30}; intent.putExtra("KEY_INT_ARRAY", numArray); // 传递String数组同理 String[] strArray = {"苹果", "香蕉", "橙子"}; intent.putExtra("KEY_STRING_ARRAY", strArray); startActivity(intent);
接收代码(第二个Activity):
// 接收int数组 int[] receivedNums = getIntent().getIntArrayExtra("KEY_INT_ARRAY"); // 接收String数组 String[] receivedStrs = getIntent().getStringArrayExtra("KEY_STRING_ARRAY");
2. ArrayList的传递(重点)
ArrayList的传递要看元素类型,必须是可序列化(Serializable)或者可Parcelable的类型(比如String、Integer默认就实现了Serializable,自定义类需要自己实现接口)。
情况1:元素是Serializable类型
比如传递ArrayList
传递代码:
ArrayList<String> fruitList = new ArrayList<>(); fruitList.add("草莓"); fruitList.add("芒果"); Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra("KEY_FRUIT_LIST", fruitList); startActivity(intent);
如果是自定义类,先让类实现Serializable:
public class User implements Serializable { private String username; private int age; // 正常编写构造方法、getter/setter即可 }
传递ArrayList
接收代码:
// 注意强转成对应的ArrayList类型 ArrayList<String> receivedFruits = (ArrayList<String>) getIntent().getSerializableExtra("KEY_FRUIT_LIST");
情况2:元素是Parcelable类型(推荐,效率更高)
如果你的自定义类比较复杂,或者追求更好的性能,推荐用Parcelable:
先编写自定义Parcelable类:
public class User implements Parcelable { private String username; private int age; public User(String username, int age) { this.username = username; this.age = age; } // 从Parcel中读取数据的构造方法 protected User(Parcel in) { username = in.readString(); age = in.readInt(); } // 必须实现的Creator public static final Creator<User> CREATOR = new Creator<User>() { @Override public User createFromParcel(Parcel in) { return new User(in); } @Override public User[] newArray(int size) { return new User[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(username); dest.writeInt(age); } // getter/setter public String getUsername() { return username; } public int getAge() { return age; } }
传递代码:
ArrayList<User> userList = new ArrayList<>(); userList.add(new User("张三", 28)); userList.add(new User("李四", 30)); Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putParcelableArrayListExtra("KEY_USER_LIST", userList); startActivity(intent);
接收代码:
ArrayList<User> receivedUsers = getIntent().getParcelableArrayListExtra("KEY_USER_LIST");
二、你的ArrayList传递失败的排查方向
你说传了两个ArrayList但接收不到数据,大概率是下面几个问题之一,你可以逐一检查:
- 传递和接收的Key不一致:Intent的Key是大小写敏感的!比如你传递用的是"LIST_1",接收写成"list_1"就会拿到null,一定要完全对应。
- ArrayList的元素没实现Serializable/Parcelable:如果你的列表里是自定义类,没实现这两个接口的话,数据根本传不出去,甚至会抛出运行时异常。
- 接收时用错了方法:比如你用
putParcelableArrayListExtra传的,接收却用getSerializableExtra,肯定拿不到数据,要对应起来。 - Intent对象错误:比如你新建Intent的时候没指定正确的目标Activity,或者传递前忘记把ArrayList put进去了。
给你一个传递两个ArrayList
第一个Activity正确代码:
// 初始化两个列表 ArrayList<String> todoList = new ArrayList<>(); todoList.add("买菜"); todoList.add("打扫卫生"); ArrayList<String> shopList = new ArrayList<>(); shopList.add("牛奶"); shopList.add("面包"); // 创建Intent并传递 Intent intent = new Intent(MainActivity.this, NextActivity.class); intent.putExtra("KEY_TODO", todoList); intent.putExtra("KEY_SHOP", shopList); startActivity(intent);
第二个Activity正确代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_next); // 接收两个列表 ArrayList<String> receivedTodo = (ArrayList<String>) getIntent().getSerializableExtra("KEY_TODO"); ArrayList<String> receivedShop = (ArrayList<String>) getIntent().getSerializableExtra("KEY_SHOP"); // 打印验证 if (receivedTodo != null) { Log.d("NextActivity", "待办列表:" + receivedTodo.toString()); } else { Log.d("NextActivity", "待办列表为空!"); } if (receivedShop != null) { Log.d("NextActivity", "购物列表:" + receivedShop.toString()); } else { Log.d("NextActivity", "购物列表为空!"); } }
如果你的列表元素是自定义类,记得给类加上Serializable或Parcelable实现,然后调整接收方法就行。
内容的提问来源于stack exchange,提问作者selva s
相关产品推荐
相关产品推荐

