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?
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
.
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
.
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.
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
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);
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!
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
.
allez à vos styles et mettez le parent
parent="Theme.AppCompat"
au lieu de
parent="@Android:style/Theme.Holo.Light"
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>
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" />
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.
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"
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>
Juste faire
new AlertDialog.Builder(this)
Au lieu de
new AlertDialog.Builder(getApplicationContext())
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;}
Changez votre parent de style de thème en
parent="Theme.AppCompat"
Cela a fonctionné pour moi ...
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>
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.
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();
Vous avez plusieurs solutions à cette erreur.
Vous devez utiliser Activité ou FragmentActivity au lieu de ActionbarActivity ou AppCompatActivity
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.
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>
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"
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">
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.
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);
}
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">
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,....);
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
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.
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.
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'
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){
}
}
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.
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>
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.
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);
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()
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.
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.
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.
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"/>