为什么Bundle对象在onCreate()上始终为null?

时间:2011-11-13 03:04:20

标签: android bundle oncreate

我正在尝试进入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 个答案:

答案 0 :(得分:14)

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

Activity API documentation中提到了这一点。

答案 1 :(得分:9)

就我而言,原因是特定活动没有在清单文件中声明主题。

要解决此问题,请打开AndroidManifest.xml,单击“应用程序”,在“应用程序节点”中选择崩溃活动,然后在“属性”的“主题”字段中添加主题。就我而言,它是

@style/Theme.AppCompat.Light.DarkActionBar

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

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

答案 2 :(得分:2)

运行此代码并按Ctrl + F11旋转屏幕。捆绑包不会为空。

@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)将被调用。然后,创建活动对象,并使用非null onCreated(Bundle)调用Bundle savedInstanceState

答案 3 :(得分: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;
}

答案 4 :(得分:0)

首先,Dave是对的-如果以前没有保存的状态-就像刚创建/启动该应用程序一样,则不会有任何状态。但是,由于您的评论看起来像您正在研究生命周期示例,因此我还提供了以下内容:

当从保存在onSaveInstanceState中的捆绑软件中取出东西时,您将在查找捆绑软件的内容之前调用onCreate的超级方法,以覆盖这段代码中该捆绑软件的内容。用超级调用切换日志,它应该可以正常工作:

function istruthyObject(obj){
    const keys = Object.keys(obj);
    let allTruthy = true;

    for(let k=0; k<keys.length;k++){
        console.log(`val: ${obj[keys[k]]} boolean: ${!!obj[keys[k]]}`);
        allTruthy = allTruthy && !!obj[keys[k]];
    }

    return allTruthy;

}

let testYes = {
    a:"hello",
    b:5,
    c: true
}

let testNo = {
    a: "hello",
    b: 5,
    c: undefined
}

console.log(`returns true: ${istruthyObject(testYes)}`);
console.log(`returns false: ${istruthyObject(testNo)}`);

在较长的覆盖范围内的某个时刻,捆绑商品设置为空