将 Bundle 放入意图后,在目标 Activity 中找不到它

Posted

技术标签:

【中文标题】将 Bundle 放入意图后,在目标 Activity 中找不到它【英文标题】:After putting Bundle into intent it cant be found in the target Activity 【发布时间】:2018-06-19 11:14:38 【问题描述】:

我正在尝试将位置列表的arraylist 放入另一个活动中,但在目标活动中检查它后显示为空。代码是:

发送活动:

Bundle args = new Bundle();
args.putSerializable("locations",  locationList);
end.putExtra("locations", args);

接收活动:

Bundle arg = getIntent().getBundleExtra("locations");
locationList = (ArrayList<List<Location>>) arg.getSerializable("locations");

有趣的是,我使用相同的原则以相同的方式将该列表放入来自服务的发送活动中。虽然我是在广播中从该服务发送它,但这会有所不同吗?

工作代码:

发送服务:

Bundle argument = new Bundle();
argument.putSerializable("locationList",locationPoints);
intent.putExtra("locations", argument);

接收活动:

 Bundle argument = intent.getBundleExtra("locations");
 locationList = (ArrayList<List<Location>>) argument.getSerializable("locationList");

有什么想法吗?

编辑:

完整方法 我尝试使用 getSerializableExtra() 但产生了相同的结果。

发送活动:

public void onEnd(View view)

 Intent end = new Intent(this, WorkoutDetailActivity.class);
    end.putExtra("duration", duration);
    end.putExtra("distance", distance);
    end.putExtra("calories", calories);
    end.putExtra("sport", sport);

    for (List<Location> list: locationList)
        for(Location location : list)
            System.out.println(location);
        
    

//        Bundle args = new Bundle();
//        args.putSerializable("locationList",  locationList);
    end.putExtra("locations", locationList);


    startActivity(end);

接收活动:

protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    // Obtain the SupportMapFragment and get notified when the map is ready 
 to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) 
getSupportFragmentManager()
            .findFragmentById(R.id.fragment_maps_workoutmap);
    mapFragment.getMapAsync(this);
  locationList = (ArrayList<List<Location>>) 
getIntent().getSerializableExtra("locations");

    System.out.println(locationList);

//        for (List<Location> list: locationList)
//            for(Location location : list)
//                System.out.println(location);
//            
//        


【问题讨论】:

也许您需要更改 locationList 或 args 的“位置”。 ?他们都有相同的密钥。 您可以添加构建“locationPoints”字段的部分吗? @Stefan 它一团糟,但结果很好。 【参考方案1】:

我认为你不见了 开始活动(意图);

【讨论】:

不,我有它只是没有包括它。活动开始,但我在尝试从包中获取可序列化时收到 NullPointerException。 捆绑 bundle=intent.getParcelableExtra("location");在接收活动中【参考方案2】:

您在接收活动中使用了两次关键“位置”。一次用于额外的捆绑包,然后将您的列表放入该捆绑包中,但您在发送活动中设置了“locationList”的键:

Bundle arg = getIntent().getBundleExtra("locations");
locationList = (ArrayList<List<Location>>) arg.getSerializable("locations"); // => there it should be "locationList"

此外,也可以通过这种方式将可序列化的活动从一个活动传递到另一个活动:

发送活动:

   intent.putExtra("locationList");

接收活动:

locationList =(ArrayList<List<Location>>)getIntent().getSerializableExtra("locationList");

【讨论】:

我不确定我是否读错了,但我就是这样。 你做的有点不同。您正在使用捆绑包将列表包装在其中。我是说您可以直接将列表传递给意图(而不是将可序列化传递给捆绑包,然后将捆绑包传递给您的意图),以便您可以直接从意图在接收活动中检索它。当然,它只有在您创建的捆绑包仅适用于您的列表时才有效。 是的,我明白我的意思是同样的关键,但我正在查看工作代码。我尝试了 getSErializableExtra() 但它产生了相同的结果。【参考方案3】:

就所提供的代码而言,似乎没有问题。尝试更改键名,因为它们都说“位置”。

如果问题仍然存在,请提供调用和接收活动的完整代码 sn-p。

更新:

带代码sn-p:

Bundle bundle = getIntent().getExtras();

if(bundle != null && bundle.getSerializableExtra("locations") != null) 
   locationList = bundle.getSerializableExtra("locations")


if(locationList != null) 
   System.out.println(locationList);

【讨论】:

用提供的 sn-p 试试。

以上是关于将 Bundle 放入意图后,在目标 Activity 中找不到它的主要内容,如果未能解决你的问题,请参考以下文章

Android - 将接口放入 Bundle

Initwithnibname:bundle: 无法从资源包中加载带有 2 个视图控制器的 xib

Bundle在Activity之间交换数据

RecyclerView 中的捆绑问题

如何将按钮值放入数据库Django

类型活动中的方法 startactivity(intent,bundle) 不适用于参数 (int,intent)