Примените похожие стили к окну AlertDialog для разных версий Android

Я хочу, чтобы окно AlertDialog для моего приложения выглядело так же, как на Android> 6.0.0 (как показано на следующих снимках экрана) для всех более ранних версий Android до 4.4.4. Я применил собственный стиль для диалогового окна.

Ниже приведен стиль в файле styles.xml для AlertDialog:

<style 
    name = "AlertDialogCustom" parent = "ThemeOverlay.AppCompat.Dialog.Alert">
    <item name = "android:textColor">@color/blue</item>
    <item name = "android:textColorSecondary">@color/white</item>
    <item name = "android:textColorPrimary">@color/white</item>
    <item name = "android:background">@color/dark_grey</item>
    <item name = "android:backgroundDimAmount">0.3</item>
</style>

Ниже показано, как я применил стиль в java:

new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.AlertDialogCustom))
            .setMessage("Why is DialogBox Style Inconsistent through different android versions?")

            // Specifying a listener allows you to take an action before dismissing the dialog.
            // The dialog is automatically dismissed when a dialog button is clicked.
            .setPositiveButton("Yes", new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialog, int which)
                {
                    //Do Something
                }
            })

            .setNegativeButton("No", new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialog, int which)
                {
                    //Do Something
                }
            })
            .show();

В качестве обхода мне удалось хотя бы изменить цвет текста на белый на темном фоне, используя:

    if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1)
        style = android.R.style.Theme_Material_Dialog;

    else
        style = R.style.AlertDialogCustom;

До сих пор я пытался создает отдельный стиль для более низкой версии Android и применяет их через java, определяя версию Android. Но я не могу воспроизвести стиль окна AlertDialog на Android 6+ в более ранних версиях Android до 4.4.4. И я не могу найти решение в Интернете.

Однако есть аномалия; если я применю свой собственный стиль к Оценить это приложение, предоставленное кобакей, результирующее диалоговое окно RateThisApp будет выглядеть одинаково во всех версиях Android. Поэтому я считаю, что стилизация AlertDialog определенным образом должна решить проблему.

Это то, что я хочу - сделать окно AlertDialog на Android 4.4.4 и 5.1.0 похожим на окно Android 6.0.0 и выше, используя подходящие стили. И почему атрибуты textColor и textColorPrimary не применяются в более ранних версиях Android?

Если ресурса, указанного в моем вопросе, недостаточно, сообщите мне об этом в комментарии, и я поделюсь более подробной информацией.

Вот скриншоты окна AlertDialog на разных версиях Android с применением одного и того же стиля.

  • Андроид >= 6.0.0

Примените похожие стили к окну AlertDialog для разных версий Android

  • Андроид = 5.1.0

Примените похожие стили к окну AlertDialog для разных версий Android

  • Андроид 4.4.4

Примените похожие стили к окну AlertDialog для разных версий Android

Почему бы не создать собственный макет для AlertDialog, а затем расширить его при создании диалогового окна?

sebasira 13.06.2019 15:26

Ах! Единственное, что я пропустил, я попробую и сообщу, решит ли это мою проблему.

FutureJJ 13.06.2019 15:28

Но просто для любопытства, почему возникает упомянутая проблема?

FutureJJ 13.06.2019 15:29

Я думаю, это должно быть из-за светлой/темной темы, которая устанавливает цвет шрифта в соответствии с

sebasira 14.06.2019 05:54

Странно, потому что я явно объявил параметр textColor.

FutureJJ 14.06.2019 06:56

да, я знаю... Иногда это случалось со мной, и я не знаю, почему. Я предполагаю, что «ThemeOverlay.AppCompat.Dialog.Alert» не указывает темный или светлый, и это может быть проблемой. Вот почему я рассказал вам о пользовательском макете, потому что вы можете установить цвет TextView прямо там и не беспокоиться о цветовой схеме

sebasira 14.06.2019 16:39

Сделал как вы посоветовали спасибо. Вы бы получили +15, если бы ответили на вопрос xD. Спасибо кстати.

FutureJJ 14.06.2019 16:45

Я рад, что был полезен!

sebasira 15.06.2019 14:07
1
8
149
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для большей гибкости вы можете просто создать свой собственный диалоговый класс с пользовательским макетом. Это даст вам лучший контроль над тем, как выглядит макет.

  • Вы можете создать очень сложный пользовательский интерфейс в своем диалоговом окне, не написав кучу кода.

  • Вы можете просто вызвать свой диалог следующим образом:

CustomDialog customDialog = new CustomDialog();
customDialog.show();

  • И вы можете управлять прослушивателями кликов и другими событиями внутри своего диалогового класса вместо того, чтобы добавлять этот код, выложенный внутри вашей активности, и делать его очень большим и трудным для понимания.

Вот пример:

public class CustomDialog extends Dialog {
private ImageView imageView;
private Context dialogContext;

public CustomDialog (@NonNull Context context) {
    super(context);
    setContentView(R.layout.full_size_image_dialog); .. //your layout
    dialogContext = context;
    imageView = findViewById(R.id.full_size_image); //controll your views (use any view, the image view is only an example)
}

public void someMethod() {
}     

  }
}

Спасибо, я разработал собственный макет диалогового окна, который смог воспроизвести внешний вид диалогового окна в более ранних версиях Android. Но есть идеи, почему атрибут textColor (и другие) не применялся к более ранним версиям Android?

FutureJJ 14.06.2019 14:38

Я думаю, что это связано с самим устройством, хотя не уверен.

Tamir Abutbul 14.06.2019 15:00

Нет, я тестировал его на разных устройствах под управлением Android.

FutureJJ 14.06.2019 15:05

Другие вопросы по теме