88 votes

Android.util.AndroidRuntimeException : requestFeature() doit être appelée avant d'ajouter du contenu

J'obtiens ceci android.util.AndroidRuntimeException: requestFeature() must be called before adding content erreur. Comme vous pouvez le voir dans le code ci-dessous, la fonction requestWindowFeature(Window.FEATURE_NO_TITLE); vient avant la ligne setContentView(R.layout.mainmenu); ligne de code. Ce code onCreate() a le même format dans presque toutes mes activités et je n'ai jamais eu de problème avec lui jusqu'à présent. Depuis que j'ai mis à jour l'ADT 22, un grand nombre d'erreurs aléatoires sont apparues un peu partout. J'ai éliminé un grand nombre de ces erreurs et voici la dernière en date.

Que puis-je faire pour corriger cette erreur ?

@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

197voto

vishesh chandra Points 1974

Je suis également confronté à ce problème, mais lorsque j'appelle une demande de fenêtre avant d'appeler super.onCreate() le problème a été résolu, essayez-le aussi comme

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

J'espère que cela vous aidera... :)


Édité : Pour d'autres solutions possibles pour les nouvelles versions d'Android

Masquer la barre d'état sur Android 4.0 et les versions inférieures

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

Les avantages de l'utilisation d'un thème d'activité sont les suivants :

  • Cette méthode est plus facile à maintenir et moins sujette aux erreurs que la définition d'un indicateur par programme.
  • Les transitions de l'interface utilisateur sont plus fluides, car le système dispose des informations nécessaires au rendu de l'interface avant d'instancier l'activité principale de l'application.

La version d'Android est inférieure à 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);
}

Masquer la barre d'état sur Android 4.1 et supérieur

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

Il convient de noter ce qui suit :

  • Une fois que les indicateurs d'interface utilisateur ont été supprimés (par exemple, en s'éloignant de l'activité), votre application doit les réinitialiser si vous souhaitez à nouveau masquer les barres. Voir Répondre aux changements de visibilité de l'interface utilisateur pour savoir comment écouter les changements de visibilité de l'interface utilisateur afin que votre application puisse réagir en conséquence.
  • L'endroit où vous définissez les drapeaux de l'interface utilisateur fait une différence. Si vous masquez les barres système dans la méthode onCreate() de votre activité et que l'utilisateur appuie sur Home, les barres système réapparaîtront. Lorsque l'utilisateur rouvrira l'activité, la méthode onCreate() ne sera pas appelée, et les barres système resteront donc visibles. Si vous souhaitez que les modifications de l'interface utilisateur persistent lorsque l'utilisateur entre et sort de votre activité, définissez des drapeaux d'interface utilisateur dans onResume() ou onWindowFocusChanged().
  • La méthode setSystemUiVisibility() n'a d'effet que si la vue à partir de laquelle vous l'appelez est visible.
  • Le fait de s'éloigner de la vue entraîne l'effacement des drapeaux définis avec setSystemUiVisibility().

14voto

androidLearner Points 134

J'ai obtenu cette exception ( android.util.AndroidRuntimeException: requestFeature() must be called before adding content ) lors de l'utilisation de

requestWindowFeature(Window.FEATURE_NO_TITLE);

dans un ancien appareil fonctionnant sous Android 2.3.5 (Gingerbread). J'utilise la bibliothèque de support v7.

L'erreur a été corrigée lorsque j'ai changé le mode d'utilisation :

supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

(Cela vient après mon appel super.onCreate dans le correctif, aussi). Voir la documentation à https://developer.Android.com/reference/Android/support/v7/app/ActionBarActivity.html#supportRequestWindowFeature(int)

Il s'agit donc peut-être plus d'un message d'erreur trompeur que d'autre chose.

7voto

Coding4Fun Points 176

Si vous utilisez votre activité en tant que dialogue (avec Theme.Dialog), assurez-vous d'étendre Activity au lieu d'ActionBarActivity (la valeur par défaut fournie par l'assistant d'Android Studio). Vous pouvez alors utiliser

requestWindowFeature(Window.FEATURE_NO_TITLE);

ou

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

APRÈS la super.onCreate() ...

7voto

haint Points 71

Veuillez vérifier que votre classe s'étend de Activity ou ActionBarActivity. Si vous utilisez ActionBarActivity, utilisez Activity.

3voto

J'ai également rencontré cette erreur dans le cadre d'un autre flux de travail. J'ai créé une classe DialogFragment personnalisée et j'ai créé deux classes @Override onCreateView et onCreateDialog. Ma fonction onCreateView a saisi une disposition personnalisée pour le fragment, et ma fonction onCreateDialog a créé un AlertDialog.Builder.

Il semble que cela ne fonctionne pas parce que la fonction onCreateDialog est appelée avant la fonction onCreateView. Après avoir supprimé onCreateView [en déplaçant l'inflation de ma vue personnalisée dans onCreateDialog], j'ai rencontré l'erreur :

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

Je me suis rendu compte que ma difficulté venait du fait que j'essayais d'implémenter les deux surcharges puisque je voulais 1) utiliser une disposition pour la vue principale de la boîte de dialogue, et 2) utiliser les boutons positifs/négatifs prédéfinis par le Builder. Ma solution a été de créer les boutons positifs/négatifs dans ma vue de dialogue personnalisée, j'ai donc supprimé mon implémentation de la fonction Override onCreateDialog.

J'espère que cela aidera quelqu'un à l'avenir !

Voici quelques questions de l'OS qui m'ont aidé :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X