1. ホーム
  2. java

[解決済み] android.util.AndroidRuntimeException: requestFeature() は、コンテンツを追加する前に呼び出す必要があります。

2023-06-26 14:30:21

質問

次のようなメッセージが表示されます。 android.util.AndroidRuntimeException: requestFeature() must be called before adding content というエラーが発生します。 以下のコードでお分かりのように requestWindowFeature(Window.FEATURE_NO_TITLE); の行の前に setContentView(R.layout.mainmenu); という行があります。 このonCreate()コードは、私のアクティビティのほぼすべてで同じ形式であり、今まで一度も問題が発生したことはありませんでした。 ADT 22にアップデートして以来、多くのランダムなエラーが至る所に出現するようになりました。 私はこれらのエラーの多くを取り除き、これは私の最新のものです。

このエラーを修正するにはどうしたらよいのでしょうか。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.mainmenu);

ログキャット

05-31 04:20:43.121: E/AndroidRuntime(14559): FATAL EXCEPTION: main
05-31 04:20:43.121: E/AndroidRuntime(14559): java.lang.RuntimeException: Unable to start activity ComponentInfo{matt.lyons.bibletrivia.lite/matt.lyons.bibletrivia.lite.MainMenu}: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.os.Looper.loop(Looper.java:137)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.main(ActivityThread.java:5041)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at java.lang.reflect.Method.invokeNative(Native Method)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at java.lang.reflect.Method.invoke(Method.java:511)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at dalvik.system.NativeStart.main(Native Method)
05-31 04:20:43.121: E/AndroidRuntime(14559): Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
05-31 04:20:43.121: E/AndroidRuntime(14559):    at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:229)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.Activity.requestWindowFeature(Activity.java:3244)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at matt.lyons.bibletrivia.lite.MainMenu.onCreate(MainMenu.java:28)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.Activity.performCreate(Activity.java:5104)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
05-31 04:20:43.121: E/AndroidRuntime(14559):    ... 11 more

どのように解決するのですか?

私もこの問題に直面しましたが、私はウィンドウの要求を呼び出すときに前に super.onCreate()を呼び出す前にウィンドウ要求を呼び出すと を呼び出すと、問題は解決しました。

@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainmenu);
}

これがあなたの助けになることを願っています...:)


編集しました。Androidの新バージョンで考えられる他の解決策について

Android 4.0 以下でステータス バーを非表示にする

<application
    ...
    android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
    ...
</application>

アクティビティテーマを使用するメリットは以下の通りです。

  • プログラムでフラグを設定するよりもメンテナンスが簡単で、エラーが起こりにくい。
  • アプリのメインアクティビティのインスタンスを作成する前に、UI をレンダリングするために必要な情報をシステムが持っているため、UI の遷移がよりスムーズになります。

AndroidのバージョンはJellybeanより低いです。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // If the Android version is lower than Jellybean, use this call to hide
    // the status bar.
    if (Build.VERSION.SDK_INT < 16) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
    setContentView(R.layout.activity_main);
}


Android 4.1以降でステータスバーを非表示にする

View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();

以下のことに注意してください。

  • UIフラグがクリアされると(アクティビティから離れるなどして)、バーを再び隠したい場合は、アプリがそれらをリセットする必要があります。以下を参照してください。 UI の可視性の変更に対応する を参照してください。
  • UI フラグを設定する場所には違いがあります。アクティビティの onCreate() メソッドでシステム バーを非表示にし、ユーザーが Home を押した場合、システム バーが再び表示されます。ユーザーがアクティビティを再び開くと、onCreate()は呼び出されないので、システムバーは表示されたままになります。ユーザーがアクティビティに出入りするときにシステム UI の変更を持続させたい場合は、onResume() または onWindowFocusChanged() で UI フラグを設定します。
  • setSystemUiVisibility() メソッドは、呼び出したビューが表示されている場合にのみ効果があります。
  • ビューから離れると、setSystemUiVisibility() で設定されたフラグがクリアされます。