Thiết kế Vật liệu không tạo kiểu hộp thoại cảnh báo


161

Tôi đã thêm thiết kế vật liệu appCompat vào ứng dụng của mình và dường như các hộp thoại cảnh báo không sử dụng màu chính, màu chính hoặc màu nhấn của tôi.

Đây là phong cách cơ sở của tôi:

<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>

Dựa trên sự hiểu biết của tôi, văn bản nút hộp thoại cũng nên sử dụng các màu này. Tôi có sai về sự hiểu biết của tôi hay tôi còn cần phải làm gì nữa không?


Giải pháp:

Câu trả lời được đánh dấu đã đưa tôi đi đúng hướng.

<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>

Bạn có thể dùng thử thư viện này mà tôi đã tạo: github.com/AndroidDeveloperLB/M vật liệuStuffL Library
nhà phát triển Android

15
Là phần dưới cùng được cho là giải pháp? Nếu vậy, hãy đăng nó dưới dạng tự trả lời , đừng chỉnh sửa câu trả lời thành câu hỏi.
Adi Inbar

Câu trả lời:


463

CẬP NHẬT vào tháng 8 năm 2019 VỚI các thành phần Vật liệu cho thư viện Android:

Với các thành phần Vật liệu mới cho thư viện Android, bạn có thể sử dụng com.google.android.material.dialog.MaterialAlertDialogBuilderlớp mới , mở rộng từ androidx.appcompat.AlertDialog.Builderlớp hiện có và cung cấp hỗ trợ cho các thông số kỹ thuật Thiết kế Vật liệu mới nhất.

Chỉ cần sử dụng một cái gì đó như thế này:

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

Bạn có thể tùy chỉnh màu sắc mở rộng ThemeOverlay.MaterialComponents.MaterialAlertDialogphong cách:

  <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>  

Để áp dụng kiểu tùy chỉnh của bạn, chỉ cần sử dụng hàm tạo:

new MaterialAlertDialogBuilder(context, R.style.CustomMaterialDialog)

nhập mô tả hình ảnh ở đây

Để tùy chỉnh các nút, tiêu đề và văn bản cơ thể kiểm tra bài đăng này để biết thêm chi tiết.

Bạn cũng có thể thay đổi toàn cầu phong cách trong chủ đề ứng dụng của mình:

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

VỚI HIB TRỢ THƯ VIỆN và APPCOMPAT ĐỀ TÀI:

Với cái mới, AppCompat v22.1bạn có thể sử dụng android.support.v7.app.AlertDialog mới .

Chỉ cần sử dụng một mã như thế này:

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

Và sử dụng một phong cách như thế này:

<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>

Nếu không, bạn có thể xác định trong chủ đề hiện tại của bạn:

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

và sau đó trong mã của bạn:

 import android.support.v7.app.AlertDialog

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

Đây là AlertDialog trên Kitkat: nhập mô tả hình ảnh ở đây


2
Tại sao buộc AlertDialog.Builder sử dụng chủ đề chính xác thay vì cập nhật một chủ đề mặc định? Tôi muốn giải quyết vấn đề này trong tệp XML thay vì mã Java.
Tomáš Hubálek

2
Phông chữ Tiêu đề và Nút không được in đậm trên các thiết bị tiền kẹo.
jimmy0251

9
Tôi đã phải đăng ký trước "android:" để làm cho nó hoạt động:<item name="android:alertDialogTheme">@style/AppCompatAlertDialogStyle</item>

1
+1 cho câu trả lời tuyệt vời nhưng Làm thế nào tôi có thể đạt được cùng một giao diện người dùng cho Phiên bản Android bên dưới Lollypop ... bởi vì với điều này trong UI bên dưới thiết bị trông rất kỳ lạ.
realpranav

1
thêm nhập android.support.v7.app.AlertDialog hoạt động
FlipNovid

9

khi khởi tạo trình tạo hộp thoại, truyền tham số thứ hai làm chủ đề. Nó sẽ tự động hiển thị thiết kế vật liệu với API cấp 21.

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

hoặc là,

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

4

AppCompat không làm điều đó cho các hộp thoại (ít nhất là chưa)

EDIT: bây giờ. đảm bảo sử dụngandroid.support.v7.app.AlertDialog


Có vẻ như bạn có thể thực hiện một số sửa đổi cho các kiểu hộp thoại với AppCompat
Matthew

Android Studio của tôi theo mặc định đã cho tôi import app.AlertDialogkhông phải là ứng dụng. Tôi đã cố gắng tìm ra những gì sai trong khoảng 40 phút trước khi tôi thực sự kiểm tra nó ... Chết tiệt google!
Vinh quang

2

Bạn có thể xem xét dự án này: https://github.com/fengdai/AlertDialogPro

Nó có thể cung cấp cho bạn các hộp thoại cảnh báo chủ đề vật chất gần giống như kẹo mút. Tương thích với Android 2.1.


Chỉ cần một lưu ý: Câu trả lời này cũ hơn, sau đó là câu trả lời được chấp nhận.
thiệu

2

Bạn đã có thể sử dụng

Thư viện thiết kế vật liệu

Thư viện thiết kế vật liệu được tạo ra cho các hộp thoại cảnh báo , nút bấm và những thứ khác như thanh đồ ăn nhẹ. Hiện tại nó đang phát triển mạnh mẽ.

Hướng dẫn, mã, ví dụ - https://github.com/navasmdc/M vật liệu thiết kế thư viện

Hướng dẫn cách thêm thư viện vào Android Studio 1.0 - Làm cách nào để nhập thư viện thiết kế tài liệu vào Android Studio?

.

Chúc mừng mã hóa;)


1

Hãy thử thư viện này:

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

Nó dựa trên DialogFragmentsthay vì AlertDialogs(như từ @afollestad). Ưu điểm chính: Hộp thoại không bỏ qua sau khi xoay và cuộc gọi lại vẫn hoạt động.


Thư viện của tôi có nhiều khả năng hơn. Và bạn luôn có thể bọc Hộp thoại bằng Hộp thoại. 😛
afollestad

1

Vì một số lý do, android: textColor dường như chỉ cập nhật màu tiêu đề. Bạn có thể thay đổi màu văn bản tin nhắn bằng cách sử dụng một

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

Hộp thoại cảnh báo kiểu dáng thiết kế vật liệu: Phông chữ tùy chỉnh, Nút, Màu sắc & hình dạng, ..

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

Phong cách:

  <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>

Đầu ra: nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.