Auf AppCompat v22.1.0 aktualisiert und jetzt mit IllegalArgumentException versehen: AppCompat unterstützt die aktuellen Designfunktionen nicht

336

Ich habe gerade meine App aktualisiert, um den neu veröffentlichten AppCompat v22.1.0 zu verwenden, und beim Öffnen meiner App wird jetzt die folgende Ausnahme angezeigt.

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)

Wie behebe ich das?

Chris Banes
quelle

Antworten:

515

AppCompat ist jetzt strenger in Bezug auf die Erwartungen in Themenfenster-Flags und stimmt besser mit dem überein, was Sie vom Framework erhalten würden.

Der Hauptgrund dafür ist die Unterstützung von AppCompatDialogs, die wir auch in dieser Version hinzugefügt haben. Sie nutzen die windowNoTitleFlagge, der AppCompat zuvor nicht viel Aufmerksamkeit geschenkt hat.

Um Ihr Problem zu beheben, haben Sie zwei Möglichkeiten:

Der einfache Weg ist, einfach Theme.AppCompat.NoActionBarals übergeordnetes Thema zu verwenden. Dies wird immer das Richtige tun.

Wenn Sie dies jedoch nicht tun können (möglicherweise müssen Sie die Aktionsleiste und keine Aktionsleiste unterstützen), sollten Sie Folgendes tun:

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

Sie sollten jetzt wieder auf dem richtigen Weg sein.

Chris Banes
quelle
129
Besser, diese Informationen in Appcompat Release Notes zu haben;)
Veaceslav Gaidarji
42
Wenn jemand feststellt, dass die Ausnahme nach dem Ausprobieren beider Optionen weiterhin besteht, stellen Sie sicher, dass Ihre Aktivität setContentView nach super.onCreate und nicht vorher aufruft. Ich habe es zuvor für andere Zwecke aufgerufen, musste es aber ändern, um den Fehler zu vermeiden.
Walmart
27
In meinem Fall musste ich <item name = "android: windowNoTitle"> true </ item>, das ich zuvor definiert hatte, in <item name = "windowNoTitle"> true </ item> ändern, um die Ausnahme zu beseitigen.
Meanman
12
@ChrisBanes: Sie haben bei Google mit Android gearbeitet. Vielleicht können Sie das Team davon überzeugen, in Zukunft gründlichere Versionshinweise zu veröffentlichen. Auf diese Weise können Android-Entwickler Fehler selbst mit Android-Designfunktionen debuggen, anstatt beim Kompilieren auf die Fehler zu stoßen.
3
Beachten Sie, dass Sie diese Änderung wahrscheinlich sowohl in der XML-Datei für Hauptstile / -themen als auch in der Version 21 vornehmen müssen. Hast mich erwischt.
Rfay
34

Diejenigen, die nach all diesen Korrekturen immer noch Fehler bekommen.

Bitte erben von

Theme.AppCompat.Light.NoActionBar

und nicht benutzen

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

Dann erhalten Sie keinen Fehler.

Adnan
quelle
Große Antwort +1
Sandeepmaaram
13

Ich fügte hinzu

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

aber es war nicht genug. Schließlich habe ich super.onCreate vor setContentView in Activity verschoben - mein Problem wurde behoben :)

   public void onCreate(Bundle savedInstanceState) {    

        super.onCreate(savedInstanceState);    
        setContentView(R.layout.v2_main_dash);
        ...
Sergey Vakulenko
quelle
Zum Glück haben Sie Ihre Antwort gefunden, setContentView nach onCreate zu verschieben. Ich habe einen halben Tag damit
Oliv
0

Verwenden Sie dies einfach in Ihrem style.xmlOrdner in values-v21. Es ist keine weitere Bearbeitung erforderlich

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

Fügen Sie der Aktivitätsdatei nichts hinzu, lassen Sie es bitte

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
quelle
11
Beachten Sie, dass der OP der Autor der Bibliothek ist und seine eigene Frage sofort beantwortet hat
Amir Uval