1

方向の変更を単独で処理するように、アクティビティのマニフェスト エントリを設定しました。

私のonConfigurationChanged()中で、私はこれを持っています:

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

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

問題なく何ヶ月も働いた後、私は電話をかけましNullPointerExceptionfindViewById()Viewの省略により、問題の はまだ作成されていないというのが私の結論ですsetContentView()

ここ本当にsetContentView()必要?もしそうなら、なぜ今まで問題なく機能していたのですか?

4

2 に答える 2

2

いいえ、その場合は電話setContentViewする必要はありません。コード内の他の何かが原因で がfindVieWByIdnull を返しています。

于 2011-07-15T22:09:23.860 に答える
1

Android Activity Docsから:

デバイスの構成 (Resources.Configuration クラスで定義) が変更された場合、ユーザー インターフェイスを表示するものはすべて、その構成に一致するように更新する必要があります。アクティビティはユーザーと対話するための主要なメカニズムであるため、構成の変更を処理するための特別なサポートが含まれています。

特に指定しない限り、構成の変更 (画面の向き、言語、入力デバイスなどの変更など) により、現在のアクティビティが破棄され、onPause()、onStop()、および onPause() の通常のアクティビティ ライフサイクル プロセスが実行されます。必要に応じて onDestroy()。アクティビティがフォアグラウンドにあるか、ユーザーに表示されていた場合、そのインスタンスで onDestroy() が呼び出されると、アクティビティの新しいインスタンスが作成され、前のインスタンスが onSaveInstanceState(Bundle) から生成した savedInstanceState が使用されます。

これは、レイアウト ファイルを含むすべてのアプリケーション リソースが任意の構成値に基づいて変更される可能性があるためです。したがって、構成の変更を処理する唯一の安全な方法は、レイアウト、ドローアブル、および文字列を含むすべてのリソースを再取得することです。アクティビティは状態を保存し、その状態から自身を再作成する方法を既に知っている必要があるため、これはアクティビティを新しい構成で再起動する便利な方法です。

いくつかの特殊なケースでは、1 つ以上のタイプの構成変更に基づいて、アクティビティの再開をバイパスしたい場合があります。これは、マニフェストの android:configChanges 属性で行われます。そこで処理する構成変更の種類については、再起動される代わりに、現在のアクティビティの onConfigurationChanged(Configuration) メソッドへの呼び出しを受け取ります。ただし、構成の変更に処理しないものが含まれている場合でも、アクティビティは再起動され、onConfigurationChanged(Configuration) は呼び出されません。

基本的に、インスタンスの状態を保存し、onConfigurationChanged() の後に情報を取得していることを確認する必要があります。

お役に立てれば!

于 2011-07-18T12:25:16.297 に答える