为什么在onCreate()方法中Bundle对象总是为null?

11

我想学习Android编程,为此我从一本书中选取了一些例子。其中一个例子要求我放置以下代码:

public class ExemploCicloVida extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        Log.i(TAG, getClassName() + " onCreate() called on: " + icicle);

        TextView t = new TextView(this);
        t.setText("Exemplo de ciclo de vida de uma Activity.\nConsulte os logs no LogCat");
        setContentView(t);
    }
}

我想知道为什么在这种情况下Bundle对象总是为空。

5个回答

17

如果没有先前保存的状态,那么包将为null。

这在Activity API文档中提到。


10

在我的情况下,原因是特定的活动没有在清单文件中声明主题。

要解决这个问题,打开AndroidManifest.xml,点击Application,在Application Nodes中选择崩溃的活动,并在Attributes的Theme字段中添加主题。在我的情况下,它是:

@style/Theme.AppCompat.Light.DarkActionBar

但是你可以从其他活动中复制主题。

P.S.:我知道这是对一个旧问题的回答,但我在搜索解决方法时偶然发现了它,并没有找到可行的解决方案,所以这可能会帮助其他人。


1
非常感谢您对此的贡献!!!您为我节省了很多麻烦...我已经在之前的活动中更改了主题,但在出现空指针的活动中没有更改!我从未想过这是问题所在!再次感谢! - DJ-DOO
非常欢迎!我浪费了很多时间才弄清楚,所以很高兴听到它帮助了别人不必经历这一切! - Vlad Schnakovszki

2

运行此代码,按下Ctrl+F11旋转屏幕。Bundle将不会为空。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState != null) {
        Toast.makeText(this, savedInstanceState.getString("s"),
                Toast.LENGTH_LONG).show();
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putString("s", "hello");
}

调用onSaveInstanceState(Bundle)方法,然后会创建活动对象,调用带有非空的Bundle savedInstanceState参数的onCreate(Bundle)方法。


1
谢谢wannik。API给了我线索,还有你的建议,我只是在自己的代码上键入了Ctrl+F11,icicle就不再为空了。 - André Barone

0
我猜您想要阅读进入活动的参数。请使用此函数:
protected String getStringExtra(Bundle savedInstanceState, String id) {
String l;
l = (savedInstanceState == null) ? null : (String) savedInstanceState
            .getSerializable(id);
if (l == null) {
    Bundle extras = getIntent().getExtras();
    l = extras != null ? extras.getString(id) : null;
}
return l;
}

0
首先,Dave是对的——如果没有之前保存的状态——比如应用程序刚创建/启动,那么就不会有状态。然而,由于您的评论看起来像是在通过生命周期示例进行工作,因此我还提供以下内容:
当从onSaveInstanceState中保存的bundle中获取内容时,通过在调用super.onCreate之前查找bundle的内容来覆盖该bundle的内容,在这段代码中。将您的日志与超级调用交换,它应该可以正常工作:
 @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        Log.i(TAG, getClassName() + " onCreate() called on: " + icicle);

在那长串的覆盖中的某个点上,该绑定被设置为 null。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接