Atualizado para AppCompat v22.1.0 e agora obtendo IllegalArgumentException: AppCompat não suporta os recursos atuais do tema

336

Acabei de atualizar meu aplicativo para usar o AppCompat v22.1.0 recém-lançado e agora recebo a seguinte exceção quando abro meu aplicativo.

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)

Como faço para corrigir isso?

Chris Banes
fonte

Respostas:

515

Agora, o AppCompat é mais rigoroso com o que ele espera nos sinalizadores de janela de tema, correspondendo melhor ao que você obteria da estrutura.

A principal razão por trás disso é oferecer suporte ao AppCompatDialogs, que também adicionamos nesta versão. Eles fazem uso pesado da windowNoTitlebandeira, à qual o AppCompat não prestava muita atenção.

Portanto, para corrigir seu problema, você tem duas opções:

A maneira mais fácil é usar apenas Theme.AppCompat.NoActionBarcomo tema principal. Isso sempre fará a coisa certa.

Se você não pode fazer isso (talvez precise suportar a barra de ação e nenhuma barra de ação), faça o seguinte:

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

Você deve estar de volta aos trilhos agora.

Chris Banes
fonte
129
Melhor ter esta informação em notas de lançamento AppCompat;)
Veaceslav Gaidarji
42
Se alguém descobrir que, depois de tentar ambas as opções, a exceção ainda persiste, verifique se sua atividade está chamando setContentView após super.onCreate, não antes. Eu o chamei antes para outros fins, mas tive que alterá-lo para evitar o erro.
Jmart
27
No meu caso, tive que alterar <item name = "android: windowNoTitle"> true </item>, que eu havia definido anteriormente como <item name = "windowNoTitle"> true </item> para se livrar da exceção.
Meanman
12
@ ChrisBanes: Você trabalhou com o Android no Google - talvez possa convencer a equipe a lançar notas de versão mais completas no futuro. Dessa forma, os desenvolvedores do Android podem usá-lo para depurar erros com os próprios recursos de design do Android, em vez de tropeçarem nos erros em tempo de compilação.
3
Observe que você provavelmente precisará fazer essa alteração no arquivo XML de estilos / temas principais E na versão v21. Me pegou.
Rfay
34

Aqueles que ainda estão recebendo erros, depois de todas essas correções.

Herde de

Theme.AppCompat.Light.NoActionBar

e não use

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

Então, você não receberá nenhum erro.

Adnan
fonte
Boa
13

Eu adicionei

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

mas não foi suficiente. Finalmente, mover super.onCreate antes de setContentView em Activity - corrigiu meu problema :)

   public void onCreate(Bundle savedInstanceState) {    

        super.onCreate(savedInstanceState);    
        setContentView(R.layout.v2_main_dash);
        ...
Sergey Vakulenko
fonte
Felizmente encontrou sua resposta de mover setContentView após onCreate, estou lutou com ele por metade de um dia ...
Oliv
0

Basta usar isso na style.xmlpasta in values-v21, nenhuma outra edição é necessária

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

Não adicione nada ao arquivo de atividades, deixe-o

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
fonte
11
Observe que o OP é o autor da biblioteca, e respondeu à sua própria pergunta imediatamente
Amir Uval