Android开发时Activity之间传送对象Bundle为null的问题

本文探讨了在Android开发中,两个Activity之间传递数据时遇到的Bundle为空的问题,并提供了具体的解决方案,包括如何正确地从Intent中获取Bundle。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个Activity之间传值,获得Bundle时为null,报错如下

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.Serializable android.os.Bundle.getSerializable(java.lang.String)' on a null object reference

代码如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(data!=null) {
        if (requestCode == 1) {
            Intent intent=getIntent();
            Bundle bundle = intent.getExtras();
            //UserBean
            UserBean userBean=(UserBean)bundle.getSerializable("UserBean");
            this.tv_username.setText(userBean.getNickName());
            this.tv_userType.setText(userBean.getName());
            SharedPreferences sharedPreferences = getSharedPreferences("user", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString("username",userBean.getName());
            editor.putString("nickname",userBean.getNickName());
            editor.putString("password", "password");
            editor.putString("id", userBean.getId());
            editor.putBoolean("isRemember", true);
            editor.commit();
        }
    }
}
问题是Intent 不能用getIntent()的值进行Bundle操作了
 Intent intent=getIntent();
 Bundle bundle = intent.getExtras();
把代码改为通过data获取Bundle:
Bundle bundle=data.getExtras();


### 使用Intent实现Activity之间数据传递 在Android开发中,`Intent` 是用来启动新 `Activity` 的核心工具,同也支持通过其附加功能 `putExtra()` 来实现在不同 `Activity` 间的数据传递。以下是基于 C# 和 Java 实现的两种方式。 #### 方法一:使用Intent直接传递简单数据类型 这是最常见的方法之一,适用于简单的数据类型(如字符串、整数等)。 ##### 发送端代码 (Java) ```java // 创建一个新的Intent实例 Intent intent = new Intent(CurrentActivity.this, TargetActivity.class); // 添加额外的数据到Intent中 intent.putExtra("key", "value"); // 启动目标Activity startActivity(intent); ``` ##### 接收端代码 (Java) ```java // 获取传入的Intent Intent receivedIntent = getIntent(); // 提取指定键对应的值 String value = receivedIntent.getStringExtra("key"); ``` 这种方法利用了 `putExtra(String name, String value)` 函数[^2],能够轻松地将数据附加至 `Intent` 对象,并由接收方提取出来。 --- #### 方法二:使用Bundle传递复杂数据结构 当需要传输更复杂的对象或者多个变量,推荐使用 `Bundle` 容器来管理这些数据。 ##### 发送端代码 (Java) ```java // 初始化Bundle对象 Bundle bundle = new Bundle(); // 将数据存入Bundle bundle.putString("message_key", "Hello from Source Activity!"); // 创建新的Intent并将Bundle附加上去 Intent intent = new Intent(CurrentActivity.this, TargetActivity.class); intent.putExtras(bundle); // 开启下一个Activity startActivity(intent); ``` ##### 接收端代码 (Java) ```java // 取得当前Activity中的Intent Intent intent = getIntent(); Bundle extras = intent.getExtras(); if (extras != null){ // 解析Bundle内的消息 String messageValue = extras.getString("message_key"); } ``` 此法借助于 `Bundle` 类型作为媒介,在其中封装任意数量的关键字-数值对[^5],从而满足更加灵活的应用场景需求。 --- #### 返回数据给前一个Activity的例子 如果希望第二个Activity能反馈某些处理后的结果回第一个,则需调用 `setResult(int resultCode, Intent data)` 配合特定标志位完成整个流程: ##### 设置返回动作 (Java) ```java Intent resultIntent = new Intent(); resultIntent.putExtra("return_data", processedData); setResult(Activity.RESULT_OK, resultIntent); finish(); // 结束本页面生命周期 ``` ##### 处理返回的结果 (Java) ```java @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode == RESULT_OK && data!=null){ String returnedMessage = data.getStringExtra("return_data"); } } ``` 这里展示了如何设置回调函数监听子activity结束事件并获取它所提供的任何响应信息[^3]。 --- ### 总结说明 以上分别介绍了三种主要途径来进行android应用内部两处交互单元间的资料交换过程。无论是基本类型的共享还是较为庞大的实体类序列化之后再传送都变得可行起来。开发者应依据实际项目情况选取最合适的策略实施编码工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡梦_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值