android.util.AndroidRuntimeException: se debe llamar a requestFeature () antes de agregar contenido

82

Recibo este android.util.AndroidRuntimeException: requestFeature() must be called before adding contenterror. Como puede ver en el siguiente código, la requestWindowFeature(Window.FEATURE_NO_TITLE);línea viene antes de la setContentView(R.layout.mainmenu);línea de código. Este código onCreate () tiene el mismo formato en casi todas mis actividades y nunca antes había tenido problemas con él hasta ahora. Desde que actualicé a ADT 22, han aparecido muchos errores aleatorios en todas partes. He eliminado muchos de esos errores y este es el último.

¿Qué puedo hacer para solucionar este error?

@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
Mate
fuente
¿Puedes elaborar? No sé qué significa "a través del tema".
Matt
Puede aplicar el tema en Manifest en la etiqueta de actividad como, android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen" en lugar de escribir código Java en onCreate.
vishesh chandra

Respuestas:

183

También enfrenté este problema, pero cuando llamo a la solicitud de ventana antes de llamar a super.onCreate () , el problema se resolvió, inténtelo también como ..

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

Espero que esto te ayudará...:)


Editado: para otras posibles soluciones para las nuevas versiones de Android

Ocultar la barra de estado en Android 4.0 y versiones inferiores

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

Las ventajas de utilizar un tema de actividad son las siguientes:

  • Es más fácil de mantener y menos propenso a errores que establecer una bandera mediante programación.
  • Da como resultado transiciones de la interfaz de usuario más suaves, porque el sistema tiene la información que necesita para representar su interfaz de usuario antes de crear una instancia de la actividad principal de su aplicación.

La versión de Android es inferior a 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);
}

Ocultar la barra de estado en Android 4.1 y superior

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

Tenga en cuenta lo siguiente:

  • Una vez que las banderas de la IU se han borrado (por ejemplo, al salir de la actividad), su aplicación debe restablecerlas si desea ocultar las barras nuevamente. Consulte Respuesta a los cambios de visibilidad de la interfaz de usuario para obtener una discusión sobre cómo escuchar los cambios de visibilidad de la interfaz de usuario para que su aplicación pueda responder en consecuencia.
  • El lugar donde establezca las banderas de la interfaz de usuario marca la diferencia. Si oculta las barras del sistema en el método onCreate () de su actividad y el usuario presiona Inicio, las barras del sistema volverán a aparecer. Cuando el usuario reabre la actividad, no se llamará a onCreate (), por lo que las barras del sistema permanecerán visibles. Si desea que los cambios de la interfaz de usuario del sistema persistan mientras el usuario entra y sale de su actividad, configure los indicadores de la interfaz de usuario en onResume () o onWindowFocusChanged ().
  • El método setSystemUiVisibility () solo tiene efecto si la vista desde la que lo llama es visible.
  • Navegar fuera de la vista hace que los indicadores establecidos con setSystemUiVisibility () se borren.
vishesh chandra
fuente
3
@clu Esta requestFeature (int featureId) debe llamarse antes de setContentView (). Se puede llamar tantas veces como se desee siempre que esté antes de setContentView (). Si no se llama, no habrá funciones ampliadas disponibles. No puede desactivar una función una vez que se solicita. Para obtener más detalles, haga clic aquí
vishesh chandra
2
Aconsejaría no llamar requestWindowFeatureantes super.onCreate. No puede estar seguro del estado de la actividad antes de ese punto.
Vbence
@vishesh chandra ¿pueden ayudarme en mi caso, esto no me funcionó? stackoverflow.com/questions/27404146/…
Sasha
3
Resolvió el problema, pero la barra de título sigue apareciendo.
Aritra Roy
Sí, para mí también sigue apareciendo la barra de acción
Parthiban M
15

Obtuve esa excepción ( android.util.AndroidRuntimeException: requestFeature() must be called before adding content) al usar

requestWindowFeature(Window.FEATURE_NO_TITLE);

en un dispositivo anterior con Android 2.3.5 (Gingerbread). Estoy usando la biblioteca de soporte v7.

El error se solucionó cuando lo cambié para usar:

supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

(Esto también viene después de mi llamada de super.onCreate en la solución). Consulte los documentos en https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportRequestWindowFeature(int)

Por lo tanto, puede ser más un caso de mensaje de error engañoso que cualquier otra cosa.

gkee
fuente
1
Funcionó también para mí. Estoy usando ActionBarActivity de la biblioteca de soporte v21.
cybergen
1
Estoy usando appCompaty también me supportRequestWindowFeaturehizo el truco y no tuve que ponerlo antessuper.onCreate
Max Koretskyi
Seguro que esto solía funcionar ya que esta publicación tiene 5 años, pero solo para tu información: Window.FEATURE_INDETERMINATE_PROGRESS está en desuso a partir de api vs. 24
Adam R. Turner
7

Compruebe que su clase se extienda desde Activity o ActionBarActivity. Si está utilizando ActionBarActivity, utilice Activity.

haint
fuente
¡Este era mi problema! Estaba extendiendo AppCompatActivity y requestWindowFeature (Window.FEATURE_NO_TITLE) no logró ocultar la barra de título hasta que cambié a extender Activity.
Casey Murray
7

Si está utilizando su actividad como un diálogo (con Theme.Dialog), asegúrese de extender Activity en lugar de ActionBarActivity (el valor predeterminado que se le proporciona con el asistente de Android Studio). Entonces puedes usar

requestWindowFeature(Window.FEATURE_NO_TITLE);

o

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

DESPUÉS del super.onCreate()...

Coding4Fun
fuente
3

También encontré este error desde un flujo de trabajo diferente. Creé una clase DialogFragment personalizada y creé dos @Overridefunciones: onCreateView y onCreateDialog. Mi función onCreateView tomó un diseño personalizado para el fragmento, y mi función onCreateDialog creó un AlertDialog.Builder.

Esto pareció no funcionar porque onCreateDialog se llama antes que onCreateView. Después de eliminar onCreateView [al mover la inflación de mi vista personalizada a onCreateDialog, encontré el error:

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

Me di cuenta de que mi dificultad provenía de intentar implementar ambas anulaciones, ya que quería 1) usar un diseño para la vista principal del cuadro de diálogo y 2) usar los botones Positivo / Negativo predefinidos de Builder. Mi solución fue crear los botones positivos / negativos en mi vista de diálogo personalizada, así que eliminé mi implementación de la función Override onCreateDialog.

¡Espero que esto ayude a alguien en el futuro!

Aquí hay algunas preguntas SO que me ayudaron:

Filósofo torpe
fuente
1
amigo, me salvaste el día! ¡Gracias! :)
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>

solo configure el estilo como este, no se requiere ningún cambio de lado de codificación.

Lalit kumar
fuente
1

Estaba extendiendo un DialogFragment y la respuesta anterior no funcionó. Tuve que usar getDialog () para eliminar el título:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
Argumento ilegal
fuente
1

Extienda ( Actividad ) en lugar de ( ActionBarActivity )

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

luego en el onCreate escribe:

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

Creo que la forma más sencilla de hacer esto es usar el siguiente código

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

Pruebe las siguientes opciones, al menos una de ellas debería funcionar para usted:

  1. Si está utilizando un DialogFragment, intente no anular ambos métodos onCreateDialog(..)y onCreateView(..) (este cambio funcionó para mí)

  2. probar supportRequestWindowFeature(Window.FEATURE_NO_TITLE)/requestWindowFeature(Window.FEATURE_NO_TITLE)antes setContentView(..)en la actividad y despuéssuper.onCreate(..);

  3. Pruebe la opción 2 antes super.onCreate(..);

Raj Kukadia
fuente
0

Perdió su línea: super.onCreate (SavedInstanceState);

usa esta manera:

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

Tuve este error con AlertDialogy el error estaba ocurriendo en API 19 solo cuando dialog.show()se llamó.

Descubrí que la android.app.AlertDialogimportación está causando el problema, así que lo cambié a androidx.appcompat.app.AlertDialogy lo solucionó.

Tenga en cuenta que esto funcionará si está utilizando androidx. si no es así, debe usar la versión anterior de appcompat de esa importación.

mohammad reza sarsarabi
fuente