【问题标题】:Why Bundle object is always null on onCreate()?为什么 Bundle 对象在 onCreate() 上总是为空?
【发布时间】:2011-12-27 21:37:59
【问题描述】:

我正在尝试进入 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 对象在这种情况下总是为空。

【问题讨论】:

    标签: android bundle oncreate


    【解决方案1】:

    如果没有先前保存的状态,则捆绑包将为空。

    Activity API documentation 中提到了这一点。

    【讨论】:

      【解决方案2】:

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

      要解决此问题,请打开 AndroidManifest.xml,单击 Application,在 Application Nodes 中选择崩溃的活动,然后在 Attributes 的 Theme 字段中添加主题。就我而言,它是

      @style/Theme.AppCompat.Light.DarkActionBar
      

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

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

      【讨论】:

      • 非常感谢您对此的投入!!!你让我省了很多麻烦......我在之前的活动中更改了主题,但在我获得空指针的活动中没有!我做梦也想不到这是问题所在!再次...开始一英里失败!
      • 不客气!我浪费了很多时间来解决这个问题,所以我很高兴听到它帮助某人没有经历这一切!
      【解决方案3】:

      运行此代码并按 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) 将被调用。然后,活动对象被创建,onCreated(Bundle) 将被非空的Bundle savedInstanceState 调用。

      【讨论】:

      • 谢谢万尼克。 API 给了我和你的线索,我只是在我自己的代码上输入了 Ctrl+F11,并且 icicle 不再为空。
      【解决方案4】:

      我猜你想阅读进入你活动的参数。使用这个功能:

      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;
      }
      

      【讨论】:

        【解决方案5】:

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

        当从保存在 onSaveInstanceState 中的包中取出内容时,您将通过在查找包的内容之前调用 onCreate 的父级来覆盖这段代码中该包的内容。用你的超级电话切换你的日志,它应该可以正常工作:

         @Override
            public void onCreate(Bundle icicle) {
                super.onCreate(icicle);
                Log.i(TAG, getClassName() + " onCreate() called on: " + icicle);
        

        在那一长串覆盖中的某个时刻,bundle 被设置为 null

        【讨论】:

          猜你喜欢
          • 2012-06-04
          • 1970-01-01
          • 1970-01-01
          • 2017-04-07
          • 2018-07-06
          • 2016-12-02
          • 2017-06-27
          • 1970-01-01
          相关资源
          最近更新 更多