Aggiornato ad AppCompat v22.1.0 e ora ottiene IllegalArgumentException: AppCompat non supporta le funzionalità del tema corrente


336

Ho appena aggiornato la mia app per utilizzare l'AppCompat v22.1.0 appena rilasciata e ora ottengo la seguente eccezione quando apro la mia app.

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)

Come lo aggiusto?

Risposte:


515

AppCompat ora è più rigoroso su ciò che si aspetta dai flag della finestra del tema, abbinando più da vicino ciò che otterresti dal framework.

Il motivo principale dietro questo è supportare AppCompatDialogs che stavamo aggiungendo anche in questa versione. Usano pesantemente la windowNoTitlebandiera, a cui AppCompat in precedenza non prestava molta attenzione.

Quindi per risolvere il problema hai due opzioni:

Il modo più semplice è usare solo Theme.AppCompat.NoActionBarcome tema principale. Questo farà sempre la cosa giusta.

Se non riesci a farlo (forse devi supportare la barra delle azioni e nessuna barra delle azioni), dovresti fare quanto segue:

<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>

Ora dovresti tornare in pista.


129
Meglio avere queste informazioni nelle note sulla versione di appcompat;)
Veaceslav Gaidarji

42
Se qualcuno rileva che dopo aver provato entrambe le opzioni l'eccezione persiste, assicurati che la tua attività chiami setContentView dopo super.onCreate, non prima. L'ho chiamato prima per altri scopi, ma ho dovuto cambiarlo per evitare l'errore.
Jmart,

27
Nel mio caso ho dovuto cambiare <item name = "android: windowNoTitle"> true </item> che avevo precedentemente definito in <item name = "windowNoTitle"> true </item> per eliminare l'eccezione.
Meanman,

12
@ChrisBanes: hai lavorato con Android su Google, forse puoi convincere il team a rilasciare note di rilascio più approfondite in futuro. In questo modo, gli sviluppatori Android possono utilizzarlo per eseguire il debug degli errori con le funzionalità di progettazione Android stesse invece di inciampare sugli errori al momento della compilazione.

3
Si noti che probabilmente è necessario apportare questa modifica sia nel file XML principale di stili / temi che nella versione v21. Mi hai preso.
rfay,

34

Coloro che continuano a ricevere errori dopo tutte quelle correzioni.

Si prega di ereditare da

Theme.AppCompat.Light.NoActionBar

e non usare

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

Quindi, non otterrai alcun errore.


Ottima risposta +1
sandeepmaaram,

13

Ho aggiunto

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

ma non era abbastanza. Infine, spostando super.onCreate prima di setContentView in Activity - risolto il problema :)

   public void onCreate(Bundle savedInstanceState) {    

        super.onCreate(savedInstanceState);    
        setContentView(R.layout.v2_main_dash);
        ...

Per fortuna ho trovato la tua risposta sullo spostamento di setContentView dopo onCreate, mi sono trovato in difficoltà per mezza giornata ...
Oliv

0

Basta usarlo nella style.xmlcartella in valori-v21, non sono necessarie altre modifiche

 <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>

Non aggiungere nulla al file delle attività, per favore lascialo

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

11
Si noti che l'OP è l'autore della biblioteca e ha risposto immediatamente alla sua domanda
Amir Uval,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.