web-dev-qa-db-fra.com

Vous devez utiliser un thème (ou un descendant) Theme.AppCompat avec cette activité.

Android Studio 0.4.5

Documentation Android pour la création de boîtes de dialogue personnalisées: http://developer.Android.com/guide/topics/ui/dialogs.html

Si vous souhaitez une boîte de dialogue personnalisée, vous pouvez plutôt afficher une activité sous la forme d'une boîte de dialogue au lieu d'utiliser les API de boîte de dialogue. Créez simplement une activité et définissez son thème sur Theme.Holo.Dialog dans L'élément manifeste <activity>:

<activity Android:theme="@Android:style/Theme.Holo.Dialog" >

Cependant, lorsque j'ai essayé, j'obtiens l'exception suivante:

Java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity

Je soutiens ce qui suit et je ne peux utiliser quelque chose de plus grand que 10 pour le minimum:

minSdkVersion 10
targetSdkVersion 19

Dans mes styles, j'ai ce qui suit:

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

Et dans mon manifeste, j'ai ceci pour l'activité:

 <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:theme="@Android:style/Theme.Holo.Light.Dialog"
            Android:name="com.ssd.register.Dialog_update"
            Android:label="@string/title_activity_dialog_update" >
        </activity>

La création de la boîte de dialogue comme celle-ci était quelque chose que je me promettais de faire, car j'ai déjà terminé la mise en page.

Quelqu'un peut-il me dire comment je peux résoudre ce problème?

848
ant2009

La raison pour laquelle vous rencontrez ce problème est parce que l'activité à laquelle vous essayez d'appliquer le thème de boîte de dialogue est en train d'étendre ActionBarActivity, ce qui nécessite l'application du thème AppCompat

Mise à jour : L'extension de AppCompatActivity aurait aussi ce problème 

Dans ce cas, modifiez l'héritage Java de ActionBarActivity à Activity et laissez le thème de la boîte de dialogue dans le manifeste tel quel, une valeur autre que Theme.AppCompat


La règle générale est que si vous voulez que votre code prenne en charge les anciennes versions d'Android, le thème devrait être AppCompat et le code Java devrait être étendu à AppCompatActivity. Si vous avez * une activité qui n'a pas besoin de cette assistance, par exemple si vous vous souciez uniquement des dernières versions et fonctionnalités d'Android, vous pouvez lui appliquer n'importe quel thème, mais le code Java doit s'étendre à l'ancienne Activity.


REMARQUE: Lorsque vous passez de AppCompatActivity (ou d'une sous-classe, ActionBarActivity) à Activity, vous devez également remplacer les divers appels avec "support" par l'appel correspondant sans "support". Ainsi, au lieu de getSupportFragmentManager, appelez getFragmentManager.

1028
Bobbake4

Tout ce que vous avez à faire, c'est d'ajouter Android:theme="@style/Theme.AppCompat.Light" à votre balise d'application dans le fichier AndroidManifest.xml.

495
iusting

Copier la réponse de @MarkKeen dans les commentaires ci-dessus car j'avais le même problème.

L'erreur a été signalée en haut de l'article et s'est produite après l'ajout d'une boîte de dialogue d'alerte. J'ai toutes les informations de style pertinentes dans le manifeste. Mon problème a été résolu en changeant une référence de contexte dans le générateur d'alertes - j'ai changé: 

new Android.support.v7.app.AlertDialog.Builder(getApplicationContext())

à: 

new Android.support.v7.app.AlertDialog.Builder(this)

Et pas plus de problèmes.

211
A.K.

min sdk est 10. ActionBar est disponible à partir du niveau 11 de l’API. Vous utiliseriez donc AppCompat à partir de la bibliothèque de support pour laquelle vous devez utiliser Theme.AppCompat ou un descendant de celui-ci.

Utilisation

Android:theme="@style/Theme.AppCompat" >

Ou si vous ne voulez pas de barre d'action en haut

Android:theme="@style/Theme.AppCompat.NoActionBar">

Plus d'informations @

http://developer.Android.com/guide/topics/ui/actionbar.html

Modifier:

J'ai peut-être mal interprété le message.

Semble op veut un dialogue avec un thème d'activité. Donc, comme suggéré par Bobbake4, étendez Activity au lieu de ActionBarActivity.

Regardez aussi @ Attributs de dialogue dans le lien ci-dessous

http://grepcode.com/file/repository.grepcode.com/Java/ext/com.google.Android/android/4.4_r1/frameworks/base/core/res/values/themes.xml/

88
Raghunandan

Cela a fonctionné pour moi, je viens de changer:

final AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());

pour ça:

final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
71
Darush

J'éprouvais ce problème même si mon thème était un thème AppCompat et que mon activité était une AppCompatActivity (ou Activity, comme suggéré dans les réponses des autres). J'ai donc nettoyé, reconstruit et relancé le projet. 

( Construire -> Nettoyer le projet; Construire -> Reconstruire le projet; Exécuter -> Exécuter )

Cela peut sembler idiot, mais maintenant il fonctionne très bien !

J'espère que ça aide!

36
Geraldo Neto

C'est ce qui me l'a corrigé: au lieu de spécifier le thème dans manifest, je l'ai défini dans onCreate pour chaque activité qui étend ActionBarActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.MyAppTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity_layout);
...
}

Ici, MyAppTheme est un descendant de Theme.AppCompat, défini en xml. Notez que le thème doit être défini avant super.onCreate et setContentView.

24
k29

allez à vos styles et mettez le parent

parent="Theme.AppCompat"

au lieu de 

parent="@Android:style/Theme.Holo.Light"
19
Yamen Nassif

Dans mon cas, je n'ai pas de fichier values-v21 dans mon répertoire res. Ensuite, je l'ai créé et y ai ajouté les codes suivants:

  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>
16
Ali Gürelli

Changer le thème de l'activité souhaitée. Cela fonctionne pour moi:

<activity
            Android:name="HomeActivity"
            Android:screenOrientation="landscape"
            Android:theme="@style/Theme.AppCompat.Light"
            Android:windowSoftInputMode="stateHidden" />
13
sharma_kunal

Si vous avez besoin d'étendre ActionBarActivity, vous avez besoin de votre style.xml:

<!-- Base application theme. -->
<style name="AppTheme" parent="AppTheme.Base"/>

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->

Si vous définissez le thème principal de votre application comme Android: Theme.Material.Light au lieu de AppTheme.Base , vous obtiendrez une «exception IllegalStateException: vous devez utiliser un thème (ou un descendant) Theme.AppCompat activité ”erreur.

13
JonasOliveira

J'ai eu un tel crash sur Samsung devices même si l'activité utilisait bien Theme.AppCompat . La cause principale était liée à des optimisations étranges du côté de Samsung:

- if one activity of your app has theme not inherited from Theme.AppCompat
- and it has also `Android:launchMode="singleTask"`
- then all the activities that are launched from it will share the same Theme

Ma solution était en train de supprimer Android:launchMode="singleTask"

12
goRGon

J'ai eu le même problème, mais il a résolu lorsque j'ai mis cela sur manifeste: Android: theme = "@ style/Theme.AppCompat.

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/icon"
        Android:label="@string/app_name_test"
        Android:supportsRtl="true"
        Android:theme="@style/Theme.AppCompat">

        ...    

    </application>
12
Marc Baduq

Juste faire

new AlertDialog.Builder(this)

Au lieu de

new AlertDialog.Builder(getApplicationContext())
9
Ali Akram

pour moi était la solution pour utiliser ContextThemeWrapper:

private FloatingActionButton getFAB() {
Context context = new Android.support.v7.view.ContextThemeWrapper(getContext(), R.style.AppTheme);
FloatingActionButton fab = new FloatingActionButton(context);
return fab;}

from Android - Comment créer FAB par programmation?

7
Peter

Changez votre parent de style de thème en 

 parent="Theme.AppCompat"

Cela a fonctionné pour moi ...

6
Fazal

Dans le manifeste Android, il suffit de changer le thème de l'activité en AppTheme en suivant le code

<activity
  Android:name=".MainActivity"
  Android:label="@string/app_name"
  Android:theme="@style/AppTheme">
</activity>
6
shikha

J'ai eu ce problème aussi et ce que j'ai fait pour le résoudre ET utiliser toujours le thème Holo a été de prendre les mesures suivantes:

d'abord j'ai remplacé cette importation:

import Android.support.v7.app.AppCompatActivity;

avec celui-ci:

import Android.app.Activity;

puis changé mon extension de:

public class MyClass extends AppCompatActivity {//...

pour ça:

public class MyClass extends Activity {//...

Et aussi dû changer cette importation:

import Android.support.v7.app.AlertDialog;

à cette importation:

import Android.app.AlertDialog;

et vous pouvez ensuite utiliser votre balise de thème dans le manifeste au niveau de l'activité:

Android:theme="@Android:style/Theme.Holo.Dialog" />

et enfin, (sauf si votre projet doit utiliser d'autres classes qui doivent utiliser v7 appCompat), vous pouvez nettoyer et reconstruire votre projet ou supprimer cette entrée dans le fichier de construction de gradle au niveau de l'application:

compile 'com.Android.support:appcompat-v7:23.2.1'

si vous avez d'autres classes dans votre projet qui doivent utiliser v7 appCompat, nettoyez et reconstruisez le projet.

6
Wraithious

C'est à ce moment que vous voulez un AlertDialog dans un fragment 

            AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
            adb.setTitle("My alert Dialogue \n");
            adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                  //some code

            } });
            adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                 dialog.dismiss();

                } });
            adb.show();
6
Avinash_ks

Vous avez plusieurs solutions à cette erreur.

  1. Vous devez utiliser Activité ou FragmentActivity au lieu de ActionbarActivity ou AppCompatActivity

  2. Si vous souhaitez utiliser ActionbarActivity ou AppCompatActivity, vous devez modifier styles.xml _ {Theme.Holo.xxxx en Theme. AppCompat.Light} (ajoutez si nécessaire à DarkActionbar)

Si vous n'avez pas besoin d'attributs avancés concernant la barre d'action ou AppCompat, vous n'avez pas besoin d'utiliser Barre d'action ou AppCompat.

6
Kaloglu

Celui-ci a fonctionné pour moi:

<application
           Android:allowBackup="true"
           Android:icon="@mipmap/ic_launcher"
           Android:label="@string/app_name"
           Android:theme="@style/AppTheme" >
           <activity
               Android:name=".MainActivity"
               Android:label="@string/app_name"
               Android:theme="@style/Theme.AppCompat.NoActionBar">

               <intent-filter>
                   <action Android:name="Android.intent.action.MAIN" />

                   <category Android:name="Android.intent.category.LAUNCHER" />
               </intent-filter>
           </activity>
</application>
5
user1501382

Votre activité s'étend ActionBarActivity qui requiert le AppCompat.theme à appliquer . Changement de ActionBarActivity en Activité ou FragmentActivity , cela résoudra problème. 

Si vous n'utilisez pas de barre d'action, alors:

Android:theme="@Android:style/Theme.Light.NoTitleBar.Fullscreen" 
5
Md Imran Choudhury

Vous en êtes venu à cela parce que vous souhaitez appliquer Material Design à votre style de thème des versions précédentes de sdk à 21. ActionBarActivity nécessite AppTheme afin que vous souhaitiez également empêcher votre propre personnalisation de votre AppTheme, il vous suffit de modifier vos styles.xml ( avant la sdk 21), de cette façon, on peut hériter d’un thème d’App Compat.

<style name="AppTheme" parent="Android:Theme.Holo.Light.DarkActionBar">

pour ça:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
5
danigonlinea

Dans mes expériences, le problème était le contexte dans lequel je montrais mon dialogue . Dans un clic de bouton, j'instancie un AlertDialog de cette façon

builder = new AlertDialog.Builder(getApplicationContext());

Mais le contexte n'était pas correct et a causé l'erreur. Je l'ai changé en utilisant le contexte de l'application de cette manière:

En déclarer section:

Context mContext;

dans la méthode onCreate

mContext = this;

Et enfin dans le code où j'ai besoin de AlertDialog:

start_stop = (Button) findViewById(R.id.start_stop);
start_stop.setOnClickListener( new View.OnClickListener()
     {
                @Override
                public void onClick(View v)
                {
                    if (!is_running)
                    {
                        builder = new AlertDialog.Builder(mContext);
                        builder.setMessage("MYTEXT")
                                .setCancelable(false)
                                .setPositiveButton("SI", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                    Task_Started = false;
                                    startTask();
                                    }
                                })
                                .setNegativeButton("NO",
                                        new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                });
                        AlertDialog alert = builder.create();
                        alert.show();
                    }
            }
        }

C'est la solution pour moi.

4
Dante

J'ai eu une activité avec le thème <Android:theme="@Android:style/Theme.Dialog"> utilisé pour afficher le dialogue dans mon appWidget et j'ai eu le même problème

j'ai résolu cette erreur en changeant le code d'activité comme ci-dessous:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.Theme_AppCompat_Dialog); //this line i added
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialog);
}
4
Elyas Nategh

Solution rapide.

Changez votre parent de thème de base dans styles.xml

Remplacer de

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

à

<style name="AppTheme" parent="Theme.AppCompat">
4
Kaloglu

Dans mon cas, un tel problème apparaissait lorsque j’essayais de montrer à Dialog . Le problème était lié au contexte, j’utilise getBaseContext () qui devrait théoriquement renvoyer le contexte d’Activité, mais n’affiche pas son contexte, avant tout thème appliqué.

Donc, je viens de remplacer getBaseContexts () par " this ", et maintenant cela fonctionne comme prévu.

        Dialog.showAlert(this, title, message,....);
3
Vitaliy A

Dans mon cas, je gonflais une vue avec ApplicationContext. Lorsque vous utilisez ApplicationContext, le thème/style n'est pas appliqué. Ainsi, bien que Theme.Appcompat existe dans mon style, il n'a pas été appliqué et a provoqué cette exception. Plus de détails: Le thème/style n'est pas appliqué lorsqu’un gonfleur est utilisé avec ApplicationContext

3
Murat

Pour moi, aucune des réponses ci-dessus n'a fonctionné même après que j'ai eu Theme.AppCompat comme thème de base pour l'application. J'utilisais com.Android.support:design:24.1.0 Donc, je viens de changer la version en 24.1.1. Après la synchronisation, son fonctionnement a repris et l'exception a disparu. Il me semble que le problème concerne certaines versions plus anciennes des bibliothèques de support à la conception.

Il suffit de mettre ceci ici au cas où d'autres réponses ne fonctionneraient pas pour certaines personnes.

3
Sharp Edge

J'avais ce même problème. Parce que je créais un tiroir de navigation personnalisé. Mais j'oublie de mentionner le thème dans mon manifeste comme ceci

Android: theme = "@ style/Theme.AppCompat.NoActionBar"

Dès que j'ai ajouté le thème ci-dessus à mon manifeste, le problème a été résolu.

3
Azhar osws

Cette solution a fonctionné pour moi. 

La bibliothèque de conception dépend des bibliothèques de support technique Support v4 et AppCompat. Par conséquent, n'utilisez pas une version différente pour appcompat et une bibliothèque de conception graduée.

utilisation 

 compile 'com.Android.support:appcompat-v7:23.0.0'
 compile 'com.Android.support:design:23.0.0'

au lieu de

 compile 'com.Android.support:appcompat-v7:23.0.0'
 compile 'com.Android.support:design:23.1.0'
3
kiran boghra

Mon activité avec SectionsPagerAdapter et ViewPager & Fragment

public class MyActivity extends AppCompatActivity implements ActionBar.TabListener
...
...
     @Override
        public void onPostResume(){
            super.onPostResume();
            try {
               getSupportActionBar().setDisplayShowTitleEnabled(false);
            }catch (NullPointerException ignored){
            }
        }
2
valera

Cela m'a vraiment obligé à poster ma propre réponse. Depuis que j'utilise Theme.AppCompat.Light.NoActionBar et que j'ai également remplacé tous les AlertDialog par des importations de support, et que des problèmes se posaient toujours sous la version v21 (Lollipop). Au bout de 2 jours, j’ai enfin réfléchi à d’autres bibliothèques spécifiant AppTheme pour leur fichier AndroidManifest.xml.

  1. Renommer 'AppTheme' en utilisant pour mon application en 'XYZAppTheme'
  2. using tools: replace method dans AndroidManifest de mon projet (app).

    <uses-permission Android:name="Android.permission.INTERNET" />
    
    <application
        Android:name=".XYZ"
        Android:allowBackup="true"
        Android:icon="@mipmap/ic_launcher_v2"
        Android:label="@string/app_name"
        Android:largeHeap="true"
        Android:roundIcon="@mipmap/ic_launcher_v2_round"
        Android:supportsRtl="true"
        Android:theme="@style/XYZAppTheme"
        tools:replace="Android:icon,Android:theme">
    
        <activity
            Android:name=".xyz.SplashActivity"
            Android:launchMode="singleTask"
            Android:screenOrientation="portrait">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
    
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    

2
Amit Tumkur

Pour moi, le problème est résolu en modifiant l'héritage d'AppCompatActivity en Activité dans ma classe customDialog. Aucune modification requise dans le manifeste pour Theme.Dialog. 

2
Kedar

Si vous utilisez getApplicationContext () comme paramètre lors du gonflage de la présentation, vous pouvez essayer d'utiliser getBaseContext () à la place. par exemple. 

    View.inflate(getBaseContext(),
            getLayoutId() == 0 ? R.layout.page_default : getLayoutId(),
            null);
2
user1744585

Changer le thème de l'onglet en surbrillance dans l'image.  enter image description here

2
saleem kalro

Lorsque vous utilisez Kotlin, rien n'a résolu mon problème jusqu'à ce que je modifie le paramètre Builder de 'applicationContext' à 'this'.

Cela ne fonctionne pas

val dialogDelete = AlertDialog.Builder(applicationContext)
            .setTitle("Confirmation")
            .setMessage("Delete this photo?")
            .setNegativeButton(Android.R.string.no){ it, which ->
                it.dismiss()
            }
dialogDelete.show()

Suivre le code fonctionne

val dialogDelete = AlertDialog.Builder(this)
            .setTitle("Confirmation")
            .setMessage("Delete this photo?")
            .setNegativeButton(Android.R.string.no){ it, which ->
                it.dismiss()
            }
dialogDelete.show()
2
Irfandi D. Vendy

Dans Android Studio: Ajoutez la bibliothèque de support au fichier Gradile et synchronisez . Modifiez build.gradle (Module: app) pour créer des dépendances comme suit:

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.Android.support:appcompat-v7:23.1.1'
compile 'com.Android.support:design:23.1.1'
compile 'com.Android.support:support-v4:23.1.1'
}

Ma version de support de la bibliothèque est 23.1.1; Utilisez la version de votre bibliothèque de support, le cas échéant.

1
CodeBulls Inc.

Dans mon cas, j’utilisais un style appelé "FullScreenTheme" et, même s’il semblait bien défini (c’était un descendant de Theme.AppCompat), il ne fonctionnait pas.

J'ai finalement réalisé que j'utilisais une bibliothèque AAR qui, en interne, avait également défini un style appelé "FullScreenTheme" et ce n'était pas descendant de Theme.AppCompat. Le choc des noms était à l'origine du problème.

Résolvez-le en renommant mon propre nom de style afin qu'Android utilise le bon style.

1
tomacco

NOTE: J'avais prévu cela comme réponse, mais des tests plus poussés ont révélé qu'il échouait encore lorsqu'il était construit avec maven à partir de la ligne de commande. J'ai donc dû le modifier pour qu'il pose problème! :-(

Dans mon cas, quand j'ai eu cette erreur, j'utilisais déjà un thème AppCompat et l'erreur n'avait pas beaucoup de sens.

J'étais en train de mavenizing ma version Android. J'avais déjà des dépendances sur les versions apklib et jar de l'application compat, donc:

    <!-- See https://github.com/mosabua/maven-Android-sdk-deployer -->
        <dependency>
            <groupId>Android.support</groupId>
            <artifactId>compatibility-v7-appcompat</artifactId>
            <version>${compatibility.version}</version>
            <type>apklib</type>
        </dependency>

        <dependency>
            <groupId>Android.support</groupId>
            <artifactId>compatibility-v7-appcompat</artifactId>
            <type>jar</type>
        </dependency>

        <dependency>
            <groupId>Android.support</groupId>
            <artifactId>compatibility-v7</artifactId>
            <type>jar</type>
        </dependency>

        <dependency>
            <groupId>Android.support</groupId>
            <artifactId>compatibility-v4</artifactId>
        </dependency>

Maintenant, lorsque j'importe le projet Maven, que je construis et que je travaille à partir d'IntelliJ, tout va bien.

Mais lorsque je construis, déploie et exécute à partir de la ligne de commande avec maven, j'obtiens toujours cette exception.

1
Andrew Mackenzie

Dans votre app/build.gradle, ajoutez cette dépendance:

implementation "com.google.Android.material:material:1.1.0-alpha03"

Mettez à jour votre parent styles.xml AppTheme:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"/>
0
Mark Pazon