it-swarm.com.ru

Текст диалога Android 6.0 не отображается

Я обновил свой телефон до Android 6.0, и у меня есть эти 2 проблемы с диалогами:

1) Заголовок отображается, но сообщения не предназначены для предупреждения (решено): 

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

2) Также заголовок фрагмента пользовательского диалога не отображается (НЕ РЕШЕНО):

        getDialog().setTitle("Title");

В Lollipop или в более старых версиях такой проблемы не было, проблема появилась только после обновления моего телефона до Marshmallow.

Как решить проблему?

25
Veka

Используйте конструктор с темой для Lollipop и более новых версий Android:

Темная тема

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

А за Светлая тема  

    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

Я столкнулся с несколькими ответами, которые говорят, что вы должны использовать следующее в своей теме приложения:

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

Хотя это правильно, это не сработало во всех местах для меня. В конце концов я понял, что в некоторых местах я использовал обычный построитель AlertDialog, а в других местах я использовал конструктор поддержки. Если вы используете поддержку AlertDialog, обязательно включите в свою тему следующее:

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

Просто поместите это в свой файл стилей внутри тега стиля Базовой темы, и все готово

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

Ответьте за 2), нам нужно вызвать setStyle() перед onCreateDialog(), потому что theme используется в 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

я попытался решить эту проблему, создав собственный стиль.

ваш объект диалога должен быть таким, а ваш стиль, указанный в этом диалоге, будет написан ниже

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>

Цвета ::

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

наконец, вывод должен быть примерно таким

Note: «Android: textColorPrimary» идет для диалогового окна setMessage, а «Android: textColor» идет для диалогового окна setTitle; я не использую кнопки setPositive и setNegative и слушателя в моем объекте диалога, но вы можете видеть их на рисунке, если хотите, чтобы вы могли создать свой собственный объект диалога.

 

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

Надеюсь, что это поможет вам.............

1
Amaresh Jana

Я подозреваю, что вы заканчиваете тем, что показывали белый текст на белом фоне! (Глядя на скриншот, значок (i) тоже не очень хорошо показывает, что это означает, что он был разработан для отображения на фоне, отличном от белого.

Вы можете использовать конструктор public AlertDialog.Builder (Context context, int themeResId), чтобы убедиться, что вы используете конкретную тему для стилизации своего диалога, где Theme_Material_Dialog, вероятно, то, что вам нужно.

1
zmarties

Может быть, ваш основной цвет текста такой же, как цвет фона диалога, в этом случае в вашем файле styles.xml (просто пример):

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

и при создании диалога:

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

После проверки этой надежды это сработает .......

0
Amaresh Jana

В моем случае все диалоги были одного цвета со шрифтами (заголовок и сообщение). Чтобы исправить это состояние, я изменил атрибут цвета в моей теме. Я скопировал файл темы xml в 'res/values-v22' и установил другой цвет для Зефира. 

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

или только для диалогов

<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
Arkadiusz Cieśliński

При использовании DialogFragment вам нужно

  1. Добавить стиль

    <style name="CustomDialog" parent="@style/Theme.AppCompat.Light.Dialog">
        <item name="Android:windowNoTitle">false</item>
    </style>
    
  2. В вашем DialogFragment добавить getTheme

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

И это все!

0
Samuel Bilý