Оновлено до AppCompat v22.1.0 і тепер отримує IllegalArgumentException: AppCompat не підтримує поточні функції теми


336

Я щойно оновив свій додаток, щоб використовувати нещодавно випущений v22.1.0 AppCompat, і я отримую наступне виняток, коли відкриваю свій додаток.

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)

Як це виправити?

Відповіді:


515

Зараз AppCompat суворіше ставиться до того, що очікує у прапорах вікон тем, більше відповідає тому, що ви отримаєте від рамки.

Основна причина цього - підтримка AppCompatDialogs, яку ми також додавали у цьому випуску. Вони дуже активно використовуютьwindowNoTitle широко прапор, на який раніше AppCompat не приділяв великої уваги.

Тож для вирішення проблеми у вас є два варіанти:

Найпростіший спосіб - просто використовувати Theme.AppCompat.NoActionBarяк батьківську тему. Це завжди зробить правильно.

Якщо ви не можете цього зробити (можливо, вам потрібно підтримувати панель дій, а не панель дій), слід зробити наступне:

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

Ви повинні повернутися зараз у дорогу.


129
Краще мати цю інформацію в примітках до випуску appcompat;)
Веачеслав Гайдарджи

42
Якщо хтось виявить, що після спроби обох варіантів виняток все ще зберігається, переконайтеся, що ваша активність викликає setContentView після super.onCreate, а не раніше. Я раніше закликав його для інших цілей, але мені довелося змінити його, щоб уникнути помилки.
jmart

27
У моєму випадку мені довелося змінити <item name = "android: windowNoTitle"> true </item>, який я раніше визначив на <item name = "windowNoTitle"> true </item>, щоб позбутися виключення.
Середовик

12
@ChrisBanes: Ви працювали з Android в Google - можливо, ви зможете переконати команду випустити більш ретельні нотатки про випуск у майбутньому. Таким чином, розробники Android можуть використовувати його для налагодження помилок із самими функціями дизайну Android, а не натикатися на помилки під час компіляції.

3
Зауважте, що вам, ймовірно, доведеться внести цю зміну як у XML-файл основних стилів / тем, так і у версію v21. Зловив мене.
rfay

34

Ті, хто все-таки отримує помилку після всіх цих виправлень.

Будь ласка, успадкуйте від

Theme.AppCompat.Light.NoActionBar

і не використовувати

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

Тоді ви не отримаєте жодної помилки.


Відмінний відповідь +1
sandeepmaaram

13

я додав

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

але це було недостатньо. Нарешті, переміщення super.onCreate перед setContentView у Activity - виправлено мою проблему :)

   public void onCreate(Bundle savedInstanceState) {    

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

Вдячно знайшов вашу відповідь про переміщення setContentView після onCreate, я боровся з ним пів дня ...
Олів,

0

Просто використовуйте це у папці style.xmlзначень-v21, не потрібне інше редагування

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

Не додайте нічого у файл активності, залиште його

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
Зауважте, що ОП є автором бібліотеки, і відповів на власне запитання негайно
Амір Уваль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.