J'utilise appcompat v22.1.0 dans mon application et utilise la barre d'outils. Tout allait bien quand j'utilise Theme.AppCompat.Light.NoActionBar
. Quand je commence à implémenter AlertDialog
, cela produit une erreur comme ceci:
Java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
at Android.support.v7.app.AppCompatDelegateImplBase.onCreate(AppCompatDelegateImplBase.Java:113)
at Android.support.v7.app.AppCompatDelegateImplV7.onCreate(AppCompatDelegateImplV7.Java:146)
at Android.support.v7.app.AppCompatDialog.<init>(AppCompatDialog.Java:47)
at Android.support.v7.app.AlertDialog.<init>(AlertDialog.Java:92)
at Android.support.v7.app.AlertDialog$Builder.create(AlertDialog.Java:882)
at com.ramabmtr.map.findingmoo.MainActivity.onOptionsItemSelected(MainActivity.Java:216)
at Android.app.Activity.onMenuItemSelected(Activity.Java:2572)
at Android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.Java:353)
at Android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.Java:144)
at Android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.Java:99)
at Android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.Java:99)
at Android.support.v7.internal.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.Java:74)
at Android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.Java:164)
at Android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.Java:740)
at Android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.Java:802)
at Android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.Java:153)
at Android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.Java:949)
at Android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.Java:939)
at Android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.Java:598)
at Android.support.v7.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.Java:139)
at Android.view.View.performClick(View.Java:4084)
at Android.view.View$PerformClick.run(View.Java:16989)
at Android.os.Handler.handleCallback(Handler.Java:615)
at Android.os.Handler.dispatchMessage(Handler.Java:92)
at Android.os.Looper.loop(Looper.Java:137)
at Android.app.ActivityThread.main(ActivityThread.Java:4812)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:511)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:792)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:559)
at dalvik.system.NativeStart.main(Native Method)
Sur la base de cette erreur, je modifie mon thème en Theme.AppCompat
et pose ceci:
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
à mon thème. Mais cela produit la même erreur.
Style.xml (old)
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>
</resources>
Style.xml (nouveau)
<resources>
<style name="AppTheme" parent="Theme.AppCompat">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>
</resources>
Quelqu'un sait comment y remédier ??
MainActivity.Java
package com.ramabmtr.map.findingmoo;
import Android.content.DialogInterface;
import Android.graphics.Typeface;
import Android.os.Bundle;
import Android.support.v4.widget.DrawerLayout;
import Android.support.v7.app.ActionBarDrawerToggle;
import Android.support.v7.app.AlertDialog;
import Android.support.v7.app.AppCompatActivity;
import Android.support.v7.widget.RecyclerView;
import Android.support.v7.widget.Toolbar;
import Android.view.View;
import Android.widget.TextView;
import Android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private TextView toolbarTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/panpizza.ttf");
toolbarTitle = (TextView) findViewById(R.id.toolbar_title);
toolbarTitle.setTypeface(myTypeface);
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
builder.setTitle(R.string.filter_title);
builder.setMessage("test");
builder.setPositiveButton(R.string.ok_button, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
builder.setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
Fondamentalement, votre activité utilise la barre d’outils (qui remplace la barre d’actions), vous devez donc utiliser un style pour l’activité qui ne possède pas de barre d’action similaire à Theme.AppCompat.Light.NoActionBar
. Si vous avez votre propre style de boîte de dialogue, vous devez hériter du thème AppCompat approprié.
<style name="myDialog" parent="Theme.AppCompat.Dialog">
<item name="Android:windowNoTitle">true</item>
...
</style>
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.myDialog));
Correction de mon problème en utilisant MainActivity.this (ou YourActivityName.this)
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
Assurez-vous que vous avez déjà Theme.AppCompat et l'extension AppCompatActivity.
Dans mon cas, cet accident est dû au fait que je passais de View.getContext().getApplicationContext()
en tant que Context
à Builder
. Ceci a été corrigé en utilisant getActivity()
à la place.
Vu cette même exception en utilisant Activity
et Theme.Light
theme. Mon problème était une mauvaise importation, j'utilisais le support. import Android.support.v7.app.AlertDialog;
au lieu de import Android.app.AlertDialog;
si vous avez cette erreur lorsque vous créez un dialogue (juste dans mon cas) vous devez utiliser ce qui suit :
AlertDialog.Builder dialog = new AlertDialog.Builder(context, R.style.Theme_AppCompat_Light);
au lieu de:
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
Cela m'a fonctionné parfaitement!
Le problème vient du contexte que vous transmettez pour créer le dialogue Alert. N'utilisez pas getApplicationContext (). Essayez d’utiliser votre contexte d’activité. Utilisez AlertDialog.Builder builder = new AlertDialog.Builder(MainActiviy.this);
Ajout d'Android: theme = "@ style/Theme.AppCompat" comme ceci dans le manifeste
<activity
Android:theme="@style/Theme.AppCompat"
Android:name=".MainActivity"
résolu le problème
Ce travail pour moi ... après avoir lu plusieurs réponses était ...
Changer mon import comme ceci:
import Android.app.AlertDialog;
au lieu de
import Android.support.v7.app.AlertDialog;
cela donne une erreur Impossible d’ajouter window - token null n’est pas pour une application ... donc je change le contexte du générateur de
AlertDialog.Builder builder = new
AlertDialog.Builder (getAplicationContext ()); à
AlertDialog.Builder builder = new AlertDialog.Builder(*MainActivity.this*);
Si vous utilisez la bibliothèque de support, votre activité est étendue à AppCompactActivity
, si vous utilisez Android studio
pour créer une activité, il s'agit de la valeur par défaut. Dans un tel cas, passez le contexte au générateur sous la forme ActivityName.this
ou simplement this
si vous le transmettez dans onCreate
, transmettre getApplicationContext()
ne fonctionnera pas.
C'est mon style en utilisant appcompact
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="Android:textSize">18sp</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
Et tout fonctionne bien lorsque j'utilise this
ou ActivityName.this
comme mentionné ci-dessus.
Si vous utilisez fragment, vous devez passer getActivity()
comme contexte au générateur au lieu de getContext()
.
En kotlin cela a fonctionné pour moi:
val dialog = AlertDialog.Builder(this)
getSupportActionBar().getThemedContext()
AlertDialog.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
builder = new AlertDialog.Builder(getSupportActionBar().getThemedContext(), Android.R.style.Theme_Material_Dialog_Alert);
} else {
builder = new AlertDialog.Builder(getSupportActionBar().getThemedContext());
}
builder.setTitle("Alert Dialog")
.setPositiveButton(Android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.setIcon(Android.R.drawable.ic_dialog_alert)
.show();
S'il vous plaît soyez prudent avec un tel problème, j'ai passé de longues heures sur un tel bogue . Cela n'arrive que sur la version Android 4.4.2, malgré le fait que j'utilise le thème Appcompat partout, essayé de jouer avec tous les styles et utilisez beaucoup d'autres discussions et réponses.
le problème a été causé par cette ligne:
<style name="LooperLabTheme"
parent.theme="@style/Theme.AppCompat.Light.NoActionBar"
theme="@style/Theme.AppCompat.Light.NoActionBar">
<style/>
s'il vous plaît notez le "parent.theme", je l'ai copié d'une réponse dans les premiers jours de lancement du projet sur lequel je me tiens, il devrait être "parent" sans le thème.
<style name="LooperLabTheme"
parent="@style/Theme.AppCompat.Light.NoActionBar"
theme="@style/Theme.AppCompat.Light.NoActionBar">
<style/>
Je veux juste aider les autres qui courent d’un fil à l’autre à trouver la solution à son problème très spécifique, c’est peut-être le même que le mien, économisez votre temps.
Vous devez passer le contexte de votre activité à la place de votre contexte. Essayez avec "ceci" au lieu de "contexte". Ce travail pour moi
Dans mon cas, je devais vérifier et m'assurer que tous les fichiers styles.xml utilisent Theme.AppCompat
. Le fichier styles.xml standard avait ce thème, mais il y avait aussi des styles (v21) .xml, styles (v11) .xml et styles (sw600dp) .xml générés automatiquement. La solution simple serait de copier et coller le style AppTheme par défaut personnalisé dans ces dossiers.
Bonne chance!