Mise à niveau vers AppCompat v22.1.0 et obtenant maintenant IllegalArgumentException: AppCompat ne prend pas en charge les fonctionnalités de thème actuelles

336

Je viens de mettre à niveau mon application pour utiliser la nouvelle version d'AppCompat v22.1.0 et j'obtiens maintenant l'exception suivante lorsque j'ouvre mon application.

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)

Comment je le répare?

Chris Banes
la source

Réponses:

515

AppCompat est désormais plus strict sur ce qu'il attend dans les indicateurs de fenêtre de thème, correspondant plus étroitement à ce que vous obtiendriez du cadre.

La principale raison derrière cela est de prendre en charge AppCompatDialogs que nous ajoutions également dans cette version. Ils font un usage windowNoTitleintensif du drapeau, auquel AppCompat ne prêtait pas beaucoup d'attention auparavant.

Donc, pour résoudre votre problème, vous avez deux options:

Le moyen le plus simple est de simplement l'utiliser Theme.AppCompat.NoActionBarcomme thème parent. Cela fera toujours la bonne chose.

Si vous ne pouvez pas faire cela cependant (vous devez peut-être prendre en charge la barre d'action et aucune barre d'action), vous devez procéder comme suit:

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

Vous devriez être de retour sur la bonne voie maintenant.

Chris Banes
la source
129
Mieux vaut avoir ces informations dans les notes de mise à jour compatibles app;)
Veaceslav Gaidarji
42
Si quelqu'un constate qu'après avoir essayé les deux options, l'exception persiste, assurez-vous que votre activité appelle setContentView après super.onCreate, pas avant. Je l'ai appelé auparavant à d'autres fins, mais j'ai dû le changer pour éviter l'erreur.
jmart
27
Dans mon cas, j'ai dû changer <item name = "android: windowNoTitle"> true </item> que j'avais défini précédemment en <item name = "windowNoTitle"> true </item> pour se débarrasser de l'exception.
Meanman
12
@ChrisBanes: Vous avez travaillé avec Android chez Google - vous pouvez peut-être persuader l'équipe de publier des notes de version plus complètes à l'avenir. De cette façon, les développeurs Android peuvent l'utiliser pour déboguer eux-mêmes les erreurs avec les fonctionnalités de conception Android au lieu de tomber sur les erreurs au moment de la compilation.
3
Notez que vous devrez probablement effectuer cette modification à la fois dans le fichier XML principal de styles / thèmes ET dans la version v21. M'a attrapé.
rfay
34

Ceux qui obtiennent toujours des erreurs après toutes ces corrections.

Veuillez hériter de

Theme.AppCompat.Light.NoActionBar

et n'utilisez pas

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

Ensuite, vous n'obtiendrez aucune erreur.

Adnan
la source
Great Answer +1
sandeepmaaram
13

J'ai ajouté

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

mais ce n'était pas suffisant. Enfin, déplacer super.onCreate avant setContentView dans Activity - a résolu mon problème :)

   public void onCreate(Bundle savedInstanceState) {    

        super.onCreate(savedInstanceState);    
        setContentView(R.layout.v2_main_dash);
        ...
Sergey Vakulenko
la source
Heureusement, j'ai trouvé votre réponse de déplacer setContentView après onCreate, je me suis débattu avec elle pendant une demi-journée ...
Oliv
0

Utilisez-le simplement dans votre style.xmldossier in values-v21, aucune autre modification n'est nécessaire

 <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'ajoutez rien au fichier d'activité, veuillez le laisser

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
la source
11
Notez que l'OP est l'auteur de la bibliothèque et a répondu immédiatement à sa propre question
Amir Uval