web-dev-qa-db-fra.com

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

Je viens de mettre à niveau mon application pour utiliser la nouvelle version v22.1.0 AppCompat et je reçois 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?

332
Chris Banes

AppCompat est désormais plus strict sur ce qu'il attend des indicateurs de la fenêtre de thème et correspond plus étroitement à ce que vous obtiendriez du cadre.

La raison principale derrière ceci est de supporter AppCompatDialogs que nous avons également ajouté dans cette version. Ils font un usage intensif du drapeau windowNoTitle, 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 d’utiliser Theme.AppCompat.NoActionBar comme thème parent. Cela fera toujours la bonne chose.

Si vous ne pouvez pas le faire cependant (vous devez peut-être prendre en charge la barre d'action et aucune barre d'action), procédez 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 sur la bonne voie maintenant.

512
Chris Banes

Ceux qui ont encore des erreurs après toutes ces corrections.

S'il vous plaît hériter de

Theme.AppCompat.Light.NoActionBar

et ne pas utiliser

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

Ensuite, vous n'obtiendrez aucune erreur.

34
Adnan

J'ai ajouté

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

mais ce n'était pas suffisant. Enfin, le déplacement de super.onCreate avant setContentView dans Activity - a corrigé mon problème :)

   public void onCreate(Bundle savedInstanceState) {    

        super.onCreate(savedInstanceState);    
        setContentView(R.layout.v2_main_dash);
        ...
13
Sergey Vakulenko

Il suffit de l'utiliser dans votre style.xml dans le dossier values-v21, aucune autre édition 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 dans le fichier d'activité s'il vous plaît laissez-le

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);
    }
}
0
Ribin Haridas