Aktualizacja do AppCompat v22.1.0 i teraz uzyskiwanie IllegalArgumentException: AppCompat nie obsługuje bieżących funkcji motywu

336

Właśnie zaktualizowałem swoją aplikację, aby korzystała z nowo wydanej aplikacji AppCompat w wersji 22.1.0, a po otwarciu aplikacji pojawia się następujący wyjątek.

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)

Jak to naprawić?

Chris Banes
źródło

Odpowiedzi:

515

AppCompat jest teraz bardziej rygorystyczny w stosunku do flag okna motywu, bardziej dopasowany do tego, co można uzyskać z frameworka.

Głównym powodem tego jest obsługa AppCompatDialogs, które również dodaliśmy w tej wersji. W dużym stopniu wykorzystują windowNoTitleflagę, na którą wcześniej AppCompat nie przywiązywał dużej uwagi.

Aby rozwiązać problem, masz dwie opcje:

Prostym sposobem jest użycie go Theme.AppCompat.NoActionBarjako motywu nadrzędnego. To zawsze będzie słuszne.

Jeśli nie możesz tego zrobić (być może potrzebujesz obsługiwać pasek akcji i nie ma paska akcji), wykonaj następujące czynności:

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

Powinieneś powrócić na właściwe tory.

Chris Banes
źródło
129
Lepiej mieć te informacje w informacjach o wydaniu appcompat;)
Veaceslav Gaidarji
42
Jeśli ktoś odkryje, że po wypróbowaniu obu opcji wyjątek nadal występuje, upewnij się, że twoja aktywność wywołuje setContentView po super.onCreate, a nie wcześniej. Dzwoniłem wcześniej do innych celów, ale musiałem to zmienić, aby uniknąć błędu.
jmart
27
W moim przypadku musiałem zmienić <item name = "android: windowNoTitle"> true </item>, który wcześniej zdefiniowałem na <item name = "windowNoTitle"> true </item>, aby pozbyć się wyjątku.
Meanman
12
@ChrisBanes: Pracowałeś z Androidem w Google - może uda ci się przekonać zespół do opublikowania bardziej szczegółowych informacji o wydaniu w przyszłości. W ten sposób programiści systemu Android mogą używać go do debugowania błędów za pomocą samych funkcji projektowania systemu Android zamiast natknąć się na błędy podczas kompilacji.
3
Zauważ, że prawdopodobnie musisz wprowadzić tę zmianę zarówno w głównym pliku XML stylów / motywów ORAZ w wersji v21. Złapał mnie.
rfay
34

Ci, którzy nadal dostają błąd po tych wszystkich naprawach.

Proszę odziedziczyć po

Theme.AppCompat.Light.NoActionBar

i nie używaj

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

Wtedy nie pojawi się żaden błąd.

Adnan
źródło
Świetna odpowiedź +1
sandeepmaaram
13

dodałem

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

ale to nie wystarczyło. Wreszcie przeniesienie super.onCreate przed setContentView w działaniu - naprawiłem mój problem :)

   public void onCreate(Bundle savedInstanceState) {    

        super.onCreate(savedInstanceState);    
        setContentView(R.layout.v2_main_dash);
        ...
Sergey Vakulenko
źródło
Na szczęście znalazłem odpowiedź na temat przeniesienia setContentView po utworzeniu onCreate, mam z tym problem przez pół dnia ...
Oliv
0

Po prostu użyj tego w swoim style.xmlfolderze w wartości-v21, żadna inna edycja nie jest potrzebna

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

Nie dodawaj niczego do pliku aktywności, zostaw to

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
źródło
11
Zauważ, że OP jest autorem biblioteki i natychmiast odpowiedział na swoje pytanie
Amir Uval,