Дизайн матеріалу не стилізує діалогове вікно оповіщення


161

Я додав дизайн додатку appCompat до своєї програми, і здається, що діалоги попередження не використовують мої основні, первинні кольори або акцентні кольори.

Ось мій базовий стиль:

<style name="MaterialNavyTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/apptheme_color</item>
    <item name="colorPrimaryDark">@color/apptheme_color_dark</item>
    <item name="colorAccent">@color/apptheme_color</item>
    <item name="android:textColorPrimary">@color/action_bar_gray</item>
</style>

На основі мого розуміння текст кнопки діалогів також повинен використовувати ці кольори. Я помиляюсь у своєму розумінні чи потрібно щось більше зробити?


Рішення:

Помічена відповідь привела мене до правильного шляху.

<style name="MaterialNavyTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/apptheme_color</item>
    <item name="colorPrimaryDark">@color/apptheme_color_dark</item>
    <item name="colorAccent">@color/apptheme_color</item>
    <item name="android:actionModeBackground">@color/apptheme_color_dark</item>
    <item name="android:textColorPrimary">@color/action_bar_gray</item>
    <item name="sdlDialogStyle">@style/DialogStyleLight</item>
    <item name="android:seekBarStyle">@style/SeekBarNavyTheme</item>
</style>

<style name="StyledDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="colorPrimary">@color/apptheme_color</item>
    <item name="colorPrimaryDark">@color/apptheme_color_dark</item>
    <item name="colorAccent">@color/apptheme_color</item>
</style>

Ви можете спробувати цю бібліотеку, яку я створив: github.com/AndroidDeveloperLB/MaterialStuffLibrary
розробник для android

15
Чи повинна вирішуватися нижня частина? Якщо це так, опублікуйте це як самовідповідь , не редагуйте відповідь на питання.
Аді Інбар

Відповіді:


463

ОНОВЛЕНО В серпні 2019 року З компонентів Матеріал для бібліотеки Android:

З новими компонентами Матеріал для бібліотеки Android ви можете використовувати новий com.google.android.material.dialog.MaterialAlertDialogBuilderклас, який походить від існуючого androidx.appcompat.AlertDialog.Builderкласу та забезпечує підтримку останніх специфікацій Material Design.

Просто використовуйте щось подібне:

new MaterialAlertDialogBuilder(context)
            .setTitle("Dialog")
            .setMessage("Lorem ipsum dolor ....")
            .setPositiveButton("Ok", /* listener = */ null)
            .setNegativeButton("Cancel", /* listener = */ null)
            .show();

Ви можете налаштувати кольори, що розширюють ThemeOverlay.MaterialComponents.MaterialAlertDialogстиль:

  <style name="CustomMaterialDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
     <!-- Background Color-->
     <item name="android:background">#006db3</item>
     <!-- Text Color for title and message -->
     <item name="colorOnSurface">@color/secondaryColor</item>
     <!-- Text Color for buttons -->
     <item name="colorPrimary">@color/white</item> 
     ....
  </style>  

Щоб застосувати свій власний стиль, просто використовуйте конструктор:

new MaterialAlertDialogBuilder(context, R.style.CustomMaterialDialog)

введіть тут опис зображення

Щоб налаштувати кнопки, заголовок та текст тексту, перевірте цю публікацію для отримання більш детальної інформації.

Ви також можете глобально змінити стиль теми теми:

 <!-- Base application theme. -->
 <style name="AppTheme" parent="Theme.MaterialComponents.Light">
    ...
    <item name="materialAlertDialogTheme">@style/CustomMaterialDialog</item>
 </style>

З ПІДТРИМКАМ БІБЛІОТЕКИ та ПРИМІТКА ТЕМА:

З новим AppCompat v22.1ви можете використовувати новий android.support.v7.app.AlertDialog .

Просто використовуйте такий код:

import android.support.v7.app.AlertDialog

AlertDialog.Builder builder =
       new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle);
builder.setTitle("Dialog");
builder.setMessage("Lorem ipsum dolor ....");
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();

І використовуйте такий стиль:

<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="colorAccent">#FFCC00</item>
        <item name="android:textColorPrimary">#FFFFFF</item>
        <item name="android:background">#5fa3d0</item>
    </style>

Інакше ви можете визначитись у поточній темі:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- your style -->
    <item name="alertDialogTheme">@style/AppCompatAlertDialogStyle</item>
</style>

а потім у своєму коді:

 import android.support.v7.app.AlertDialog

    AlertDialog.Builder builder =
           new AlertDialog.Builder(this);

Ось AlertDialog про Kitkat: введіть тут опис зображення


2
Чому змусити AlertDialog.Builder використовувати точну тему замість оновлення за замовчуванням? Я вважаю за краще вирішити цю проблему в styles.xml замість коду Java.
Томаш Хубалек

2
На шрифтах заголовка та кнопок не жирним шрифтом на пристроях попередньої льодяниці.
jimmy0251

9
Мені довелося додати "android:", щоб він працював:<item name="android:alertDialogTheme">@style/AppCompatAlertDialogStyle</item>

1
+1 для чудової відповіді, але як я можу досягти того ж інтерфейсу користувача для версії Android нижче Lollypop ... тому що з цим нижче інтерфейс пристрою виглядає так дивно.
realpranav

1
додати імпорт android.support.v7.app.AlertDialog працює
FlipNovid

9

при ініціалізації конструктора діалогів передайте другий параметр як тему. Він автоматично покаже дизайн матеріалу з рівнем 21 API.

AlertDialog.Builder builder = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_DARK);

або,

AlertDialog.Builder builder = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);

4

AppCompat не робить цього для діалогів (поки що принаймні)

EDIT: це зараз. обов'язково використовуватиandroid.support.v7.app.AlertDialog


Схоже, ви можете внести деякі зміни в стилі діалогів за допомогою AppCompat
Метью

моя Android Studio за замовчуванням дала мені import app.AlertDialogне appCompat. Я спробував з’ясувати, що не так вже близько 40 хвилин, перш ніж я насправді це перевіряю ... Чорт ти, Google!
Glorifind

2

Ви можете розглянути цей проект: https://github.com/fengdai/AlertDialogPro

Він може забезпечити діалогове вікно попередження теми про тему, майже таке ж, як і льодяник. Сумісний з Android 2.1.


Лише зауваження: ця відповідь старіша, то прийнята.
rekire

2

Ви можете використовувати

Бібліотека матеріального дизайну

Бібліотека дизайну матеріалів створена для досить тривожних діалогів , кнопок та інших речей, таких як закусочні В даний час він досить розвинений.

Посібник, код, приклад - https://github.com/navasmdc/MaterialDesignLibrary

Посібник, як додати бібліотеку до Android Studio 1.0 - Як імпортувати бібліотеку дизайну матеріалів до Android Studio?

.

Щасливе кодування;)


1

Спробуйте цю бібліотеку:

https://github.com/avast/android-styled-dialogs

Він заснований на DialogFragmentsзамість AlertDialogs(наприклад, від @afollestad). Основна перевага: діалоги не відхиляються після обертання, а зворотні дзвінки все ще працюють.


Моя бібліотека набагато здатніша. І ви завжди можете обернути діалог діалоговим фрагментом. 😛
afollestad

1

Чомусь андроїд: textColor, здається, лише оновлює колір заголовка. Ви можете змінити колір тексту повідомлення, скориставшись a

SpannableString.AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.MyDialogTheme));

AlertDialog dialog = builder.create();
                Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");
                wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                dialog.setMessage(wordtoSpan);
                dialog.show();

0

Діалогові діалогові вікна стильового дизайну матеріалів: спеціальний шрифт, кнопка, колір та форма, ..

 MaterialAlertDialogBuilder(requireContext(),
                R.style.MyAlertDialogTheme
            )
                .setIcon(R.drawable.ic_dialogs_24px)
                .setTitle("Feedback")
                //.setView(R.layout.edit_text)
                .setMessage("Do you have any additional comments?")
                .setPositiveButton("Send") { dialog, _ ->

                    val input =
                        (dialog as AlertDialog).findViewById<TextView>(
                            android.R.id.text1
                        )
                    Toast.makeText(context, input!!.text, Toast.LENGTH_LONG).show()

                }
                .setNegativeButton("Cancel") { _, _ ->
                    Toast.makeText(requireContext(), "Clicked cancel", Toast.LENGTH_SHORT).show()
                }
                .show()

Стиль:

  <style name="MyAlertDialogTheme" parent="Theme.MaterialComponents.DayNight.Dialog.Alert">
  
        <item name="android:textAppearanceSmall">@style/MyTextAppearance</item>
        <item name="android:textAppearanceMedium">@style/MyTextAppearance</item>
        <item name="android:textAppearanceLarge">@style/MyTextAppearance</item>

        <item name="buttonBarPositiveButtonStyle">@style/Alert.Button.Positive</item>
        <item name="buttonBarNegativeButtonStyle">@style/Alert.Button.Neutral</item>
        <item name="buttonBarNeutralButtonStyle">@style/Alert.Button.Neutral</item>

        <item name="android:backgroundDimEnabled">true</item>

        <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.MyApp.Dialog.Rounded
        </item>

    </style>




    <style name="MyTextAppearance" parent="TextAppearance.AppCompat">
        <item name="android:fontFamily">@font/rosarivo</item>
    </style>


        <style name="Alert.Button.Positive" parent="Widget.MaterialComponents.Button.TextButton">
   <!--     <item name="backgroundTint">@color/colorPrimaryDark</item>-->
        <item name="backgroundTint">@android:color/transparent</item>
        <item name="rippleColor">@color/colorAccent</item>
        <item name="android:textColor">@color/colorPrimary</item>
       <!-- <item name="android:textColor">@android:color/white</item>-->
        <item name="android:textSize">14sp</item>
        <item name="android:textAllCaps">false</item>
    </style>


    <style name="Alert.Button.Neutral" parent="Widget.MaterialComponents.Button.TextButton">
        <item name="backgroundTint">@android:color/transparent</item>
        <item name="rippleColor">@color/colorAccent</item>
        <item name="android:textColor">@color/colorPrimary</item>
        <!--<item name="android:textColor">@android:color/darker_gray</item>-->
        <item name="android:textSize">14sp</item>
        <item name="android:textAllCaps">false</item>
    </style>


  <style name="ShapeAppearanceOverlay.MyApp.Dialog.Rounded" parent="">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">8dp</item>
    </style>

Вихід: введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.