在 Intent 中设置 Bundle 后为 null

Bundle is null after setting it in Intent

提问人:Xeon 提问时间:4/11/2012 最后编辑:CommunityXeon 更新时间:4/29/2016 访问量:24993

问:

我知道有这样的问题:android-intent-bundle-always-null 和 intent-bundle-returns-null-time,但没有正确答案。

在我的 :Activity 1

public void goToMapView(Info info) {
    Intent intent = new Intent(getApplicationContext(), MapViewActivity.class);
    //intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    intent.putExtra("asdf", true);
    info.write(intent);
    startActivity(intent);
}

在信息中:

public void write(Intent intent) {
    Bundle b = new Bundle();
    b.putInt(AppConstants.ID_KEY, id);
    ... //many other attributes
    intent.putExtra(AppConstants.BUNDLE_NAME, b);
}
public static Info read(Bundle bundle) {
    Info info = new Info();
    info.setId(bundle.getInt(AppConstants.ID_KEY));
    ... //many other attributes
    return info;
}

在 MapViewActivity () 中:Activity 2

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_view);

    Bundle extras = getIntent().getBundleExtra(AppConstants.BUNDLE_NAME);
    info = Info.read(extras);
    ...
}

问题是捆绑包总是 null。我已经调试了它,Intent () 将所有字段都设置为 null,除了一个指示这是什么类的字段 ()。extrasintent = getIntent()MapViewActivity

我也尝试过以相同的效果放置捆绑包。 仅出于调试原因 - 我也无法获得此数据(因为几乎所有字段都设置为 null)。intent.putExtras(b)intent.putExtra("asdf", true)getIntent()

编辑

下面的答案是正确的,而且是有效的。这是我的错。我没有正确地将我的捆绑包传递给新意图。

android-intent 捆绑包

评论


答:

9赞 Mark Pazon 4/11/2012 #1

我不确定“信息”的用途,但我建议在涉及其他数据对象之前,先将数据从一个活动传递到另一个活动。

活动1

    Intent intent = new Intent(Activity1.this, Activity2.class);
    intent.putExtra("asdf", true);
    info.write(intent);
    startActivity(intent);

活动2

    Bundle bundle = getIntent.getExtras();
    if (bundle!=null) {
        if(bundle.containsKey("asdf") {
            boolean asdf = bundle.getBooleanExtra("asdf");
            Log.i("Activity2 Log", "asdf:"+String.valueOf(asdf));
        }
    } else {
        Log.i("Activity2 Log", "asdf is null");

    }

评论

0赞 Xeon 4/11/2012
Info 类用于聚合我需要的信息。它具有静态的“读取”和实例的“写入”方法,以提高可读性。最基本的数据传递是通过输入“asdf”来表示的,这是行不通的。你的意思是代替吗?没有这样的方法。我只是检查你的例子 - 我明白.但无论如何,谢谢。getBooleangetBooleanExtraasdf is null
0赞 Scott Jodoin 6/14/2022
第一行需要两个if语句可以组合成短路。Bundle bundle = getIntent().getExtras();if (bundle != null && bundle.containsKey("asdf")) {
4赞 Ravi1187342 4/11/2012 #2

活动 1

Intent intent = new Intent(getApplicationContext(), MapViewActivity.class);

        Bundle b = new Bundle();
         b.putBoolean("asdf", true);
         b.putInt(AppConstants.ID_KEY, id);
         intent.putExtras(b);

         startActivity(intent);

活动 2

Bundle extras = getIntent().getExtras();

 boolean bool = extras.getBoolean("asdf");
 int m_int = extras.getInt(AppConstants.ID_KEY,-1);

评论

0赞 Xeon 4/12/2012
我已经尝试过了,因为它在底部有问题:“我也尝试过以相同的效果放置捆绑包”。Info 类没有错。intent.putExtras(b)
0赞 Ravi1187342 4/12/2012
上面应该可以正常工作。无论如何,尝试将值直接放在意图中,例如 和intent.putExtra("asdf",false);intent.putExtra(AppConstants.ID_KEY,id);