android.util.AndroidRuntimeException: requestFeature () muss aufgerufen werden, bevor Inhalte hinzugefügt werden

82

Ich erhalte diesen android.util.AndroidRuntimeException: requestFeature() must be called before adding contentFehler. Wie Sie im folgenden Code sehen können, steht die requestWindowFeature(Window.FEATURE_NO_TITLE);Zeile vor setContentView(R.layout.mainmenu);der Codezeile. Dieser onCreate () - Code hat in nahezu jeder meiner Aktivitäten das gleiche Format und ich hatte bisher noch nie Probleme damit. Seit ich auf ADT 22 aktualisiert habe, sind überall viele zufällige Fehler aufgetreten. Ich habe viele dieser Fehler beseitigt und dies ist meine neueste.

Was kann ich tun, um diesen Fehler zu beheben?

@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
Matt
quelle
Können Sie das näher erläutern? Ich weiß nicht, was "durch Thema" bedeutet.
Matt
Sie können das Thema in Manifest unter dem Aktivitäts-Tag android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen" anwenden, anstatt Java-Code in onCreate zu schreiben.
Vishesh Chandra

Antworten:

182

Ich war auch mit diesem Problem konfrontiert, aber wenn ich die Fensteranforderung aufrufe, bevor ich super.onCreate () aufrufe, dann ist das Problem gelöst, bitte versuchen Sie es auch wie ..

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

Hoffe das wird dir helfen ... :)


Bearbeitet: Für andere mögliche Lösungen für neue Android-Versionen

Blenden Sie die Statusleiste unter Android 4.0 und niedriger aus

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

Die Verwendung eines Aktivitätsthemas bietet folgende Vorteile:

  • Es ist einfacher zu warten und weniger fehleranfällig als das programmgesteuerte Setzen eines Flags.
  • Dies führt zu reibungsloseren Übergängen der Benutzeroberfläche, da das System über die Informationen verfügt, die zum Rendern Ihrer Benutzeroberfläche erforderlich sind, bevor die Hauptaktivität Ihrer App instanziiert wird.

Android-Version ist niedriger als 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);
}

Blenden Sie die Statusleiste unter Android 4.1 und höher aus

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();

Beachte das Folgende:

  • Sobald die UI-Flags gelöscht wurden (z. B. indem Sie von der Aktivität weg navigieren), muss Ihre App sie zurücksetzen, wenn Sie die Balken wieder ausblenden möchten. Unter Reagieren auf Änderungen der Sichtbarkeit der Benutzeroberfläche finden Sie eine Erläuterung, wie Sie auf Änderungen der Sichtbarkeit der Benutzeroberfläche achten können, damit Ihre App entsprechend reagieren kann.
  • Wo Sie die UI-Flags setzen, macht einen Unterschied. Wenn Sie die Systemleisten in der onCreate () -Methode Ihrer Aktivität ausblenden und der Benutzer Home drückt, werden die Systemleisten wieder angezeigt. Wenn der Benutzer die Aktivität erneut öffnet, wird onCreate () nicht aufgerufen, sodass die Systemleisten sichtbar bleiben. Wenn Sie möchten, dass Änderungen an der System-Benutzeroberfläche bestehen bleiben, während der Benutzer in Ihre Aktivität hinein- und aus dieser heraus navigiert, setzen Sie UI-Flags in onResume () oder onWindowFocusChanged ().
  • Die Methode setSystemUiVisibility () wirkt sich nur aus, wenn die Ansicht sichtbar ist, aus der Sie sie aufrufen.
  • Wenn Sie von der Ansicht weg navigieren, werden die mit setSystemUiVisibility () gesetzten Flags gelöscht.
Vishesh Chandra
quelle
3
@clu Diese requestFeature (int featureId) muss vor setContentView () aufgerufen werden. Kann beliebig oft aufgerufen werden, solange es vor setContentView () liegt. Wenn nicht aufgerufen, sind keine erweiterten Funktionen verfügbar. Sie können eine Funktion nicht deaktivieren, sobald sie angefordert wurde. Für mehr Details klicken Sie hier
Vishesh Chandra
2
Ich würde davon abraten, requestWindowFeaturevorher anzurufen super.onCreate. Sie können sich über den Status der Aktivität vor diesem Zeitpunkt nicht sicher sein.
Vbence
@ Vishesh Chandra können Sie in meinem Fall helfen, dies funktioniert nicht für mich stackoverflow.com/questions/27404146/…
Sasha
3
Das Problem wurde behoben, aber die Titelleiste wird weiterhin angezeigt.
Aritra Roy
Ja, für mich erscheint auch noch die
Parthiban M
14

Ich habe diese Ausnahme ( android.util.AndroidRuntimeException: requestFeature() must be called before adding content) bei der Verwendung

requestWindowFeature(Window.FEATURE_NO_TITLE);

in einem älteren Gerät mit Android 2.3.5 (Gingerbread). Ich verwende die v7-Unterstützungsbibliothek.

Der Fehler wurde behoben, als ich ihn änderte, um zu verwenden:

supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

(Dies kommt auch nach meinem super.onCreate-Aufruf im Fix). Siehe Dokumente unter https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportRequestWindowFeature(int)

Es kann sich also eher um eine irreführende Fehlermeldung als um irgendetwas anderes handeln.

Gkee
quelle
1
Arbeitete auch für mich. Ich verwende ActionBarActivity aus der Support-Bibliothek v21.
Cybergen
1
Ich benutze appCompatund so supportRequestWindowFeaturetat der Trick für mich und ich musste es nicht vorher setzensuper.onCreate
Max Koretskyi
Sicher, dass dies früher funktioniert hat, da dieser Beitrag 5 Jahre alt ist, aber nur zu Ihrer Information: Window.FEATURE_INDETERMINATE_PROGRESS ist ab API gegen 24 veraltet
Adam R. Turner
7

Bitte überprüfen Sie, ob Ihre Klasse von Activity oder ActionBarActivity erweitert wurde. Wenn Sie ActionBarActivity verwenden, verwenden Sie bitte Activity.

haint
quelle
Das war mein Problem! Ich habe AppCompatActivity erweitert und die requestWindowFeature (Window.FEATURE_NO_TITLE) konnte die Titelleiste nicht erfolgreich ausblenden, bis ich zur Erweiterung von Activity überging.
Casey Murray
7

Wenn Sie Ihre Aktivität als Dialogfeld (mit Theme.Dialog) verwenden, stellen Sie sicher, dass Sie Aktivität anstelle von ActionBarActivity erweitern (die Standardeinstellung, die Sie mit dem Android Studio-Assistenten erhalten haben). Dann können Sie verwenden

requestWindowFeature(Window.FEATURE_NO_TITLE);

oder

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

Nach dem super.onCreate()...

Coding4Fun
quelle
3

Ich bin auch auf diesen Fehler aus einem anderen Workflow gestoßen. Ich habe eine benutzerdefinierte DialogFragment-Klasse erstellt und zwei @OverrideFunktionen erstellt - onCreateView und onCreateDialog. Meine onCreateView-Funktion hat ein benutzerdefiniertes Layout für das Fragment erstellt, und meine onCreateDialog-Funktion hat einen AlertDialog.Builder erstellt.

Dies schien nicht zu funktionieren, da der onCreateDialog vor onCreateView aufgerufen wird. Nachdem ich onCreateView [durch Verschieben meiner benutzerdefinierten Ansichtsinflation in onCreateDialog gelöscht habe, ist der Fehler aufgetreten:

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

Ich erkannte, dass meine Schwierigkeit darin bestand, beide Überschreibungen zu implementieren, da ich 1) ein Layout für die Hauptansicht des Dialogfelds verwenden und 2) die vom Builder vordefinierten Positiv / Negativ-Schaltflächen verwenden wollte. Meine Lösung bestand darin, die positiven / negativen Schaltflächen in meiner benutzerdefinierten Dialogansicht zu erstellen. Daher habe ich meine Implementierung der Funktion Override onCreateDialog gelöscht.

Hoffe das hilft jemandem in der Zukunft!

Hier sind einige SO-Fragen, die mir geholfen haben:

Fehlerhafter Philosoph
quelle
1
Alter, du hast meinen Tag gerettet! Danke dir! :)
Bassem Wissa
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>

Nur einen solchen Stil einstellen, es ist keine Änderung der Codierungsseite erforderlich.

Lalit Kumar
quelle
1

Ich habe ein DialogFragment erweitert und die obige Antwort hat nicht funktioniert. Ich musste getDialog () verwenden, um den Titel zu entfernen:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
Illegales Argument
quelle
1

Erweitern Sie ( Aktivität ) anstelle von ( ActionBarActivity )

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

dann in das onCreate schreiben:

super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.Your_Activity);
Mohammed El-Sharnouby
quelle
0

Ich denke, der einfachste Weg, dies zu tun, ist die Verwendung des folgenden Codes

  getActionBar().setTitle(null);
Hasan
quelle
0

Bitte probieren Sie die folgenden Optionen aus, mindestens eine davon sollte für Sie funktionieren:

  1. Wenn Sie ein DialogFragment verwenden, versuchen Sie nicht, beide Methoden zu überschreiben onCreateDialog(..)und onCreateView(..) (Diese Änderung hat bei mir funktioniert)

  2. Versuchen Sie es supportRequestWindowFeature(Window.FEATURE_NO_TITLE)/requestWindowFeature(Window.FEATURE_NO_TITLE)vorher setContentView(..)in der Aktivität und danachsuper.onCreate(..);

  3. Versuchen Sie vorher Option 2 super.onCreate(..);

Raj Kukadia
quelle
0

Ihre Zeile wurde falsch platziert: super.onCreate (savedInstanceState);

benutze diese Art:

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

Ich hatte diesen Fehler mit AlertDialogund der Fehler trat in API 19 nur auf, wenn er dialog.show()aufgerufen wurde.

android.app.AlertDialogIch habe herausgefunden, dass der Import das Problem verursacht, also habe ich es geändert androidx.appcompat.app.AlertDialogund es behoben.

Beachten Sie, dass dies funktioniert, wenn Sie Androidx verwenden. Wenn Sie dies nicht tun, sollten Sie die alte Appcompat-Version dieses Imports verwenden.

mohammad reza sarsarabi
quelle