Примените похожие стили для окна AlertDialog для разных версий Android - PullRequest
1 голос
/ 13 июня 2019

Я хочу, чтобы окно 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.И я не могу найти решение в интернете.

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

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

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

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

  • Android> = 6.0.0

enter image description here

  • Android = 5.1.0

enter image description here

  • Android 4.4.4

enter image description here

1 Ответ

1 голос
/ 13 июня 2019

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

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

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

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

  }
}
...