【问题标题】:Do you have to call setContentView() from onConfigurationChanged()?您是否必须从 onConfigurationChanged() 调用 setContentView()?
【发布时间】:2011-07-15 20:25:51
【问题描述】:

我已为我的 Activity 设置清单条目,以便它自己处理方向更改。

在我的onConfigurationChanged() 中,我有这个:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    findViewById(R.id.header).post(new Runnable() {
        @Override
        public void run() {
        }
    });
}

经过几个月没有问题的工作,我刚刚在findViewById() 线上有一个NullPointerException。我的结论是,由于setContentView() 的遗漏,问题中的View 尚未创建。

setContentView() 这里真的有必要吗?如果是这样,为什么它一直正常工作?

【问题讨论】:

  • 不,没有必要。您的代码中的其他内容导致 findVieWById 返回 null。
  • Felix 可能是对的。查找初始化包含 R.id.header 的任何布局的位置。可能和那个有关
  • @Felix 谢谢,你是对的,一个单独的问题导致该视图丢失。重新发布您的回复作为答案,我会接受。

标签: android screen-rotation


【解决方案1】:

不,在这种情况下无需致电setContentView。您的代码中的其他内容导致 findVieWById 返回 null。

【讨论】:

    【解决方案2】:

    来自Android Activity Docs

    如果设备的配置(由 Resources.Configuration 类)更改,然后任何显示 用户界面将需要更新以匹配该配置。 因为 Activity 是与 用户,它包括对处理配置更改的特殊支持。

    除非您另有说明,否则配置更改(例如更改 在屏幕方向、语言、输入设备等)将导致您的 当前要销毁的活动,进行正常活动 onPause()、onStop() 和 onDestroy() 的生命周期过程为 合适的。如果活动已经在前台或可见 用户,一旦在那个实例中调用 onDestroy() 然后一个新的 将创建活动的实例,无论 上一个实例生成的 savedInstanceState onSaveInstanceState(Bundle)。

    这样做是因为任何应用程序资源,包括布局文件, 可以根据任何配置值进行更改。因此,唯一安全的方法 处理配置更改是重新检索所有资源, 包括布局、可绘制对象和字符串。因为活动必须 已经知道如何保存他们的状态并从 该状态,这是重新启动活动的便捷方式 本身具有新的配置。

    在某些特殊情况下,您可能希望绕过重新启动您的 基于一种或多种类型的配置更改的活动。这是 使用清单中的 android:configChanges 属性完成。对于任何 您说在那里处理的配置更改类型,您将 接听您当前活动的电话 onConfigurationChanged(Configuration) 方法而不是被 重新启动。如果配置更改涉及您不涉及的任何内容 处理,但是,活动仍将重新启动,并且 onConfigurationChanged(Configuration) 不会被调用

    基本上,您需要确保保存实例状态,并在 onConfigurationChanged() 之后取回信息

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多