web-dev-qa-db-fra.com

Vous devez utiliser un thème (ou un descendant) Theme.AppCompat avec cette activité. Passer à Theme.AppCompat provoque une autre erreur

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();
}
}
53
Rama Bramantara

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));
80
inmyth

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.

95
mariozawa

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.

48
Binoy Babu

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;

21
Rogelio

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!

6
Karoly

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

3
Rajesh.k

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

2
GoGam

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*);
2
Carolina

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().

1
Inzimam Tariq IT

En kotlin cela a fonctionné pour moi:

val dialog = AlertDialog.Builder(this)
0
hertzon
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();
0
miragessee

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.

0

Vous devez passer le contexte de votre activité à la place de votre contexte. Essayez avec "ceci" au lieu de "contexte". Ce travail pour moi

0
oskarko

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!