Actualizado a AppCompat v22.1.0 y ahora obteniendo IllegalArgumentException: AppCompat no admite las características actuales del tema

336

Acabo de actualizar mi aplicación para usar la nueva versión v22.1.0 AppCompat y ahora obtengo la siguiente excepción cuando abro mi aplicación.

Caused by: java.lang.IllegalArgumentException: AppCompat does not support the current theme features
        at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:360)
        at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:246)
        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)

¿Cómo lo soluciono?

Chris Banes
fuente

Respuestas:

515

AppCompat ahora es más estricto en cuanto a lo que espera en los indicadores de la ventana del tema, y ​​coincide más estrechamente con lo que obtendría del marco.

La razón principal detrás de esto es para apoyar AppCompatDialogs que también estábamos agregando en esta versión. Hacen un uso intensivo de la windowNoTitlebandera, a la que AppCompat anteriormente no le prestaba mucha atención.

Entonces, para solucionar su problema, tiene dos opciones:

La manera fácil es usarlo Theme.AppCompat.NoActionBarcomo tema principal. Esto siempre hará lo correcto.

Sin embargo, si no puede hacer eso (tal vez necesite admitir la barra de acción y ninguna barra de acción), debe hacer lo siguiente:

<style name="MyTheme" parent="Theme.AppCompat">
    ...
</style>

<style name="MyTheme.NoActionBar">
    <!-- Both of these are needed -->
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

Deberías volver a la normalidad ahora.

Chris Banes
fuente
129129
Es mejor tener esta información en las notas de la versión de appcompat;)
Veaceslav Gaidarji
42
Si alguien descubre que después de probar ambas opciones, la excepción aún persiste, asegúrese de que su actividad llame a setContentView después de super.onCreate, no antes. Lo llamé antes para otros fines, pero tuve que cambiarlo para evitar el error.
jmart
27
En mi caso, tuve que cambiar <item name = "android: windowNoTitle"> true </item> que había definido previamente a <item name = "windowNoTitle"> true </item> para deshacerme de la excepción.
Meanman
12
@ChrisBanes: Trabajaste con Android en Google, tal vez puedas persuadir al equipo para que publique notas de lanzamiento más completas en el futuro. De esta manera, los desarrolladores de Android pueden usarlo para depurar errores con las características de diseño de Android en lugar de tropezar con los errores en el momento de la compilación.
3
Tenga en cuenta que probablemente tenga que hacer este cambio tanto en el archivo XML de estilos / temas principales como en la versión v21. Me atrapó
rfay
34

Aquellos que todavía reciben un error después de todos esos arreglos.

Por favor hereda de

Theme.AppCompat.Light.NoActionBar

y no uses

<item name="windowActionBar">false</item>

Entonces, no obtendrá ningún error.

Adnan
fuente
Gran respuesta +1
sandeepmaaram
13

yo añadí

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

Pero no fue suficiente. Finalmente, mover super.onCreate antes de setContentView en Activity - solucionó mi problema :)

   public void onCreate(Bundle savedInstanceState) {    

        super.onCreate(savedInstanceState);    
        setContentView(R.layout.v2_main_dash);
        ...
Sergey Vakulenko
fuente
Afortunadamente encontré tu respuesta de mover setContentView después de onCreate, tuve problemas con eso durante medio día ...
Oliv
0

Solo use esto en su style.xmlcarpeta in values-v21, no se necesita otra edición

 <style name="AppTheme" parent="Theme.AppCompat">

    <!-- theme customizations -->

   <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
 </style>

No agregue nada al archivo de actividad, déjelo

public class Main extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
Ribin Haridas
fuente
11
Tenga en cuenta que el OP es el autor de la biblioteca, y respondió su propia pregunta de inmediato
Amir Uval