android.util.AndroidRuntimeException:コンテンツを追加する前にrequestFeature()を呼び出す必要があります


82

この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);

LogCat

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

詳細を教えていただけますか?「テーマを通して」とはどういう意味かわかりません。
マット

onCreateでJavaコードを記述する代わりに、android:theme = "@ android:style /Theme.NoTitleBar.Fullscreen"のようなアクティビティタグの下でマニフェストのテーマを適用できます。
vishesh chandra 2013年

回答:


183

私もこの問題に直面しましたが、super.onCreate()を呼び出す前にウィンドウリクエストを呼び出すと、問題は解決しました。同様に試してみてください。

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

これがお役に立てば幸いです... :)


編集:Androidの新しいバージョンのための他の可能な解決策について

Android4.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);
}

Android4.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の可視性の変更への応答」を参照してください。
  • UIフラグを設定する場所が違います。アクティビティのonCreate()メソッドでシステムバーを非表示にし、ユーザーがHomeを押すと、システムバーが再表示されます。ユーザーがアクティビティを再度開くと、onCreate()が呼び出されないため、システムバーは表示されたままになります。ユーザーがアクティビティに出入りするときにシステムUIの変更を保持する場合は、onResume()またはonWindowFocusChanged()でUIフラグを設定します。
  • メソッドsetSystemUiVisibility()は、呼び出し元のビューが表示されている場合にのみ効果があります。
  • ビューから離れると、setSystemUiVisibility()で設定されたフラグがクリアされます。

3
@cluこのrequestFeature(int featureId)は、setContentView()の前に呼び出す必要があります。setContentView()の前であれば、何度でも呼び出すことができます。呼び出されない場合、拡張機能は利用できません。一度要求された機能をオフにすることはできません。詳細については、ここをクリックしてください
vishesh chandra 2013

2
requestWindowFeature前に電話しないことをお勧めしsuper.onCreateます。その時点より前のアクティビティの状態については確信が持てません。
vbence 2013年

@visheshチャンドラあなたがヘルプには、私の場合には、これは私のために働いていないことができstackoverflow.com/questions/27404146/...
サーシャ

3
問題は解決しましたが、タイトルバーは引き続き表示されます。
アリトラロイ2014

はい、私にとってもアクションバーはまだ表示されています
Parthiban M

15

android.util.AndroidRuntimeException: requestFeature() must be called before adding content使用時に例外()が発生しました

requestWindowFeature(Window.FEATURE_NO_TITLE);

Android 2.3.5(Gingerbread)を実行している古いデバイス。v7サポートライブラリを使用しています。

使用するように変更すると、エラーが修正されました。

supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

(これは、修正でのsuper.onCreate呼び出しの後にも発生します)。https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportRequestWindowFeature(int)のドキュメントを参照してください

したがって、それは何よりも誤解を招くエラーメッセージのケースである可能性があります。


1
私のためにも働いた。サポートライブラリv21のActionBarActivityを使用しています。
cybergen 2014年

1
私は使っappCompatているのでsupportRequestWindowFeature、私のためにトリックをしました、そして私は前にそれを置く必要はありませんでしたsuper.onCreate
Max Koretskyi 2015年

この投稿は5年前なので、これは以前は機能していたことを確認してください。ただし、fyi:Window.FEATURE_INDETERMINATE_PROGRESSは、api vs. 24
Adam

7

クラスがActivityまたはActionBarActivityから拡張されていることを確認してください。ActionBarActivityを使用している場合は、Activityを使用してください。


これが私の問題でした!AppCompatActivityを拡張していましたが、Activityの拡張に切り替えるまで、requestWindowFeature(Window.FEATURE_NO_TITLE)はタイトルバーを非表示にできませんでした。
ケーシーマレー

7

アクティビティを(Theme.Dialogを使用して)ダイアログとして使用している場合は、ActionBarActivity(Android Studioウィザードで指定されるデフォルト)ではなく、必ずActivityを拡張してください。その後、あなたは使用することができます

requestWindowFeature(Window.FEATURE_NO_TITLE);

または

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

super.onCreate()...


3

また、別のワークフローからこのエラーが発生しました。カスタムDialogFragmentクラスを作成し、@OverrideonCreateViewとonCreateDialogの2つの関数を作成しました。私のonCreateView関数はフラグメントのカスタムレイアウトを取得し、私のonCreateDialog関数はAlertDialog.Builderを作成しました。

onCreateDialogがonCreateViewの前に呼び出されるため、これは機能しないように見えました。onCreateView [カスタムビューのインフレーションをonCreateDialogに移動して削除した後、次のエラーが発生しました。

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

1)ダイアログのメインビューにレイアウトを使用し、2)Builderの事前定義されたポジティブ/ネガティブボタンを使用したかったので、両方のオーバーライドを実装しようとするのが難しいことに気付きました。私の解決策は、カスタムダイアログビューで正/負のボタンを作成することだったので、OverrideonCreateDialog関数の実装を削除しました。

これが将来誰かに役立つことを願っています!

これが私を助けたいくつかのSOの質問です:


1
あなたは私の日を救った男!ありがとうございました!:)
Bassem Wissa 2017

2

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowActionBar">false</item>

    </style>

このようにスタイルを設定するだけで、コーディング側を変更する必要はありません。


1

DialogFragmentを拡張していましたが、上記の回答が機能しませんでした。タイトルを削除するには、getDialog()を使用する必要がありました。

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

1

ActionBarActivity)の代わりに(Activity)を拡張します

例: public class Itemdetails extends Activity {....

次に、onCreateで次のように書き込みます。

super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.Your_Activity);

0

これを行う最も簡単な方法は、以下のコードを使用することだと思います

  getActionBar().setTitle(null);

0

次のオプションを試してください。これらの少なくとも1つが機能するはずです。

  1. DialogFragmentを使用している場合は、両方のメソッドonCreateDialog(..)をオーバーライドしないようにしてくださいonCreateView(..) (この変更は私にとってはうまくいきました)

  2. アクティビティのsupportRequestWindowFeature(Window.FEATURE_NO_TITLE)/requestWindowFeature(Window.FEATURE_NO_TITLE)setContentView(..)と後に試してくださいsuper.onCreate(..);

  3. 前にオプション2を試してください super.onCreate(..);


0

行を置き忘れました:super.onCreate(savedInstanceState);

この方法を使用してください:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_qrscanner);

0

このエラーが発生しAlertDialog、API19でエラーが発生したのは次の場合のみでした。dialog.show()が呼び出されたに。

ことを考え出したandroid.app.AlertDialog私はそれを変更して、インポートが問題を引き起こしているandroidx.appcompat.app.AlertDialogと、それはそれを修正。

これは、androidxを使用している場合に機能することに注意してください。そうでない場合は、そのインポートの古いappcompatバージョンを使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.