web-dev-qa-db-fra.com

Le texte de dialogue Android 6.0 n'apparaît pas

J'ai mis à jour mon téléphone vers Android 6.0 et j'ai ces 2 problèmes de dialogues:

1) Le titre est affiché mais les messages ne sont pas destinés au dialogue d'alerte (RESOLU): 

        new AlertDialog.Builder(context).setTitle("Title").setMessage("Message");

2) De plus, le titre du fragment de boîte de dialogue personnalisé n'est pas affiché (NON RÉSOLU):

        getDialog().setTitle("Title");

Il n'y avait pas un tel problème dans Lollipop ou dans les versions antérieures, le problème est apparu seulement après la mise à jour de mon téléphone vers Marshmallow.

Comment résoudre le problème?

25
Veka

Utilisez constructeur avec thème pour Lollipop et les nouvelles versions d'Android:

Thème sombre

    AlertDialog.Builder builder;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        builder = new AlertDialog.Builder(context, Android.R.style.Theme_Material_Dialog_Alert);
    } else {
        builder = new AlertDialog.Builder(context);
    }

Et pour Thème lumière  

    AlertDialog.Builder builder;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        builder = new AlertDialog.Builder(context, Android.R.style.Theme_Material_Light_Dialog_Alert);
    } else {
        builder = new AlertDialog.Builder(context);
    }
36
Oleksandr

Je suis tombé sur quelques réponses qui indiquent que vous devez utiliser les éléments suivants dans le thème de votre application:

<item name="Android:alertDialogTheme">@style/Theme.AppCompat.Light.Dialog.Alert</item>

Bien que cela soit correct, cela ne fonctionnait pas partout pour moi. Finalement, j'ai réalisé que dans certains endroits, j'utilisais le générateur AlertDialog standard et dans d'autres, j'utilisais le générateur de support. Si vous utilisez le support AlertDialog, veillez également à inclure les éléments suivants dans votre thème:

<item name="alertDialogTheme">@style/Theme.AppCompat.Light.Dialog.Alert</item>
29
Stephen

Il suffit de mettre cela dans votre fichier de styles dans votre balise de style de thème de base et vous êtes prêt à partir

<item name="Android:alertDialogTheme">@style/Theme.AppCompat.Light.Dialog.Alert</item>
18
Yash Ladia

Répondre pour 2), nous devons appeler setStyle() avant onCreateDialog() car theme est utilisé dans onCreateDialog()

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        setStyle(STYLE_NORMAL, Android.R.style.Theme_Material_Light_Dialog_Alert);
    }
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.setTitle(R.string.dialog_title);
    return dialog;
}
9
fkm

j'ai essayé de résoudre ce problème en créant mon propre style.

votre objet de dialogue devrait être comme ceci et votre style pointé sur ce dialogue sera écrit ci-dessous

new AlertDialog.Builder(new ContextThemeWrapper(Context, R.style.Dialog))
            .setTitle("Title")
            .setMessage("Sample Message ...").show();

R.style.Dialog ::

<style name="Dialog">
    <item name="Android:textColorPrimary">@color/primary_text</item>
    <item name="Android:textColor">@color/primary_color</item>
</style>

Couleurs ::

<color name="primary_text">#212121</color>
<color name="primary_color">#2196f3</color>

enfin, la sortie devrait être quelque chose comme ça

Note: "Android: textColorPrimary" va pour le dialogue setMessage et "Android: textColor" va pour le dialogue setTitle; Je n'utilise ni bouton ni écouteur setPositive et setNegative dans mon objet de dialogue, mais vous pouvez les voir dans l'image si vous le souhaitez, vous pouvez créer votre propre objet de dialogue.

 

6
ShahinFasihi
new AlertDialog.Builder(context)
    .setTitle("Delete entry")
    .setMessage("Are you sure you want to delete this entry?")
    .setPositiveButton(Android.R.string.yes, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) { 
            // continue with delete
        }
     })
    .setNegativeButton(Android.R.string.no, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) { 
            // do nothing
        }
     })
    .setIcon(Android.R.drawable.ic_dialog_alert)
     .show();

J'espère que ceci vous aidera.............

1
Amaresh Jana

Je soupçonne que vous finissez par montrer du texte blanc sur un fond blanc! (En regardant la capture d'écran, l'icône (i) ne s'affiche pas bien non plus, ce qui suggère qu'elle a été conçue pour être affichée sur un fond autre que le blanc.

Vous pouvez utiliser le constructeur public AlertDialog.Builder (Context context, int themeResId) pour vous assurer que vous utilisez un thème spécifique pour styliser votre boîte de dialogue, où Theme_Material_Dialog est probablement ce que vous voulez.

1
zmarties

Peut-être que la couleur principale de votre texte est la même que la couleur d’arrière-plan de la boîte de dialogue. Dans ce cas, utilisez dans votre styles.xml (juste un exemple):

<style name="AlertDialog" parent="@Android:style/Theme.Material.Light.Dialog.Alert">
    <item name="Android:textColor">#000000</item>
</style>

et dans la création de dialogue:

new AlertDialog.Builder(
        new ContextThemeWrapper(getContext(), R.style.AlertDialog))
).setMessage("test");
1
Borzh
@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_fire_missiles)
               .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // FIRE ZE MISSILES!
                   }
               })
               .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // User cancelled the dialog
                   }
               });
        // Create the AlertDialog object and return it
        return builder.create();
    }

Une fois vérifier cet espoir cela fonctionnera .......

0
Amaresh Jana

Dans mon cas, tous les dialogues avaient la même couleur que les polices (titre et message). Ce que j'ai fait pour corriger cet état était le changement de l'attribut color dans mon thème. J'ai copié le fichier de thème XML dans le fichier 'res/values-v22' et ai défini une couleur différente pour Marshmallow. 

<resources>
    <style name="LywCompatTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="Android:textColorPrimary">@Android:color/tertiary_text_dark</item>
    </style>
</resources>

ou seulement pour les dialogues

<resources>
    <style name="LywCompatTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="Android:alertDialogTheme">@style/LywAlertDialogStyle</item>
    </style>
    <style name="LywAlertDialogStyle" parent="Base.Theme.AppCompat.Light.Dialog.Alert">
        <item name="Android:textColorPrimary">@color/lyw_secondary_text_color</item>
    </style>
</resources>
0

Lorsque vous utilisez DialogFragment, vous devez

  1. Ajouter du style

    <style name="CustomDialog" parent="@style/Theme.AppCompat.Light.Dialog">
        <item name="Android:windowNoTitle">false</item>
    </style>
    
  2. Dans votre DialogFragment ajouter getTheme

    public class CustomDialogFragment extends DialogFragment{
        public int getTheme() { 
            return R.style.CustomDialogFragment; 
        }
        .
        .
        .
    

Et c'est tout!

0
Samuel Bilý