Cách sử dụng và định kiểu AlertDialog mới từ appCompat 22.1 trở lên


154

Tôi đang cố gắng di chuyển từ Android mặc định AlertDialogsang phiên bản mới có trong appCompat-22.1 Cho đến nay tôi hiểu bạn chỉ phải nhậpandroid.support.v7.app.AlertDialog gói để sử dụng nó.

Nhưng làm thế nào tôi có thể phong cách nó? Ví dụ thay đổi màu nút dương / âm, màu tiêu đề, màu thông báo và màu nền?

Câu trả lời:


448

Khi tạo, AlertDialogbạn có thể thiết lập một chủ đề để sử dụng.

Ví dụ - Tạo hộp thoại

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

style.xml - Kiểu tùy chỉnh

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Used for the buttons -->
    <item name="colorAccent">#FFC107</item>
    <!-- Used for the title and text -->
    <item name="android:textColorPrimary">#FFFFFF</item>
    <!-- Used for the background -->
    <item name="android:background">#4CAF50</item>
</style>

Kết quả

alertdialog theo kiểu

Biên tập

Để thay đổi Giao diện của Tiêu đề, bạn có thể làm như sau. Đầu tiên thêm một phong cách mới:

<style name="MyTitleTextStyle">
    <item name="android:textColor">#FFEB3B</item>
    <item name="android:textAppearance">@style/TextAppearance.AppCompat.Title</item>
</style>

sau đó chỉ cần tham khảo phong cách này trong MyAlertDialogStyle :

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    ...
    <item name="android:windowTitleStyle">@style/MyTitleTextStyle</item>
</style>

Bằng cách này, bạn có thể xác định khác nhau textColorcho thông báo qua android:textColorPrimaryvà khác với tiêu đề thông qua kiểu.


2
Cảm ơn bạn @reVerse Một điều nữa. Nhiều thư viện cho phép có màu Tiêu đề và Văn bản khác nhau. Bạn có biết nếu điều này là có thể ở đây quá?
ThanosFisherman

3
Này lần nữa! Có cách nào để thay đổi kích thước văn bản của tin nhắn?
ThanosFisherman

1
@ThanosF Thật không may, tôi không biết bất kỳ thuộc tính xml nào thực hiện điều này. Nhưng nó chắc chắn có thể thông qua Mã Java.
xác minh lại

2
@summers Jup. Về cơ bản, đó là ý tưởng của appcompat-v7nó - nó mang khả năng tương thích ngược của các thành phần mới hơn xuống API Cấp 7 (Android 2.1)
xác minh lại

1
Để các màu văn bản của nút hoạt động trên 21+, tôi đã phải có một mục android: buttonStyle thành "MyAlertDialogStyle" và một mục android: textColor theo kiểu nút tùy chỉnh.
Tim Autin

61

Để sử dụng một chủ đề cho tất cả ứng dụng và không sử dụng tham số thứ hai để tạo kiểu cho Hộp thoại của bạn

<style name="MyTheme" parent="Base.Theme.AppCompat.Light">
    <item name="alertDialogTheme">@style/dialog</item>
    <item name="colorAccent">@color/accent</item>
</style>

<style name="dialog" parent="Base.Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">@color/accent</item>
</style>

Trên ứng dụng của tôi sử dụng dấu màu trong chủ đề, không hiển thị các nút của alertDialog với màu chủ đề. Tôi phải thêm kiểu hộp thoại trong chủ đề.


Không hoạt động trên API 10 (android 2.3), có lẽ chỉ trên API 11+.
Oliv

2
Có thể trên API 15+. Tôi chỉ bắt đầu dự án mới trên API 15+, tôi nghĩ rằng Android trước 4 đã lỗi thời vào năm 2015.
neoteknic

@Oliv Nó hoạt động trên API 10 bằng cách sử dụng phụ thuộc com.android.support:design:23.2.1
người qua đường

IDEA nói rằng API 21+ là bắt buộc để sử dụng colorAccent trên Base.Theme.AppCompat.Light.Dialog.Alert sử dụng 'com.android.support:design:22.2.1'
Felipe Andrade

@Felipe Andrade Alway nhắm mục tiêu phiên bản SDK mới nhất, nó sẽ hoạt động! Tôi có một projet với min api 15 và thiết kế mục tiêu 25: 22.x đã lỗi thời, sử dụng 25.1.x trở lên
neoteknic

19

Nếu bạn muốn sử dụng android.support.v7.app.AlertDialog mới và có các màu khác nhau cho các nút và cũng có bố cục tùy chỉnh thì hãy xem https://gist.github.com/JoachimR/6bfbc175d5c8116d411e của tôi

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.custom_layout, null);

    initDialogUi(v);

    final AlertDialog d = new AlertDialog.Builder(activity, R.style.AppCompatAlertDialogStyle)
            .setTitle(getString(R.string.some_dialog_title))
            .setCancelable(true)
            .setPositiveButton(activity.getString(R.string.some_dialog_title_btn_positive),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            doSomething();
                            dismiss();
                        }
                    })
            .setNegativeButton(activity.getString(R.string.some_dialog_title_btn_negative),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dismiss();
                        }
                    })
            .setView(v)
            .create();

    // change color of positive button         
    d.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialog) {
            Button b = d.getButton(DialogInterface.BUTTON_POSITIVE);
            b.setTextColor(getResources().getColor(R.color.colorPrimary));
        }
    });

    return d;
}

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


Thật tuyệt! Cảm ơn bạn
ThanosFisherman

Cảm ơn, đây là cách duy nhất nó hoạt động với tôi, nhưng bạn có thể cho tôi biết làm thế nào tôi có thể lấy màu cho hộp kiểm tra không? Trong ứng dụng của tôi, có một hộp thoại với danh sách các nút radio được tạo thông qua Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener). Tôi không muốn đi xa đến việc phân lớp bộ điều hợp và điều chỉnh chế độ xem ở đó.
Gabor

pháo hạng nặng là thứ luôn hoạt động! Tôi đã phải sử dụng điều này để chăm sóc 2 nút nổi loạn luôn từ chối thay đổi sang màu nhấn!
rupps

7

Thực hiện theo câu trả lời @reVerse nhưng trong trường hợp của tôi, tôi đã có một số tài sản theo ý AppThememuốn của mình

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="android:textColor">#111</item>
    <item name="android:textSize">13sp</item>
</style>

Vì vậy, hộp thoại của tôi sẽ giống như
nhập mô tả hình ảnh ở đây

Tôi đã giải quyết nó bằng cách

1) Thay đổi nhập khẩu từ android.app.AlertDialogđể android.support.v7.app.AlertDialog
2) Tôi ghi đè 2 tài sản trong AppThemevới giá trị null

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Used for the buttons -->
    <item name="colorAccent">#FFC107</item>
    <!-- Used for the title and text -->
    <item name="android:textColorPrimary">#FFFFFF</item>
    <!-- Used for the background -->
    <item name="android:background">#4CAF50</item>


    <item name="android:textColor">@null</item>
    <item name="android:textSize">@null</item>
</style>

.

AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.MyAlertDialogStyle);

Hy vọng nó sẽ giúp người khác

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


Ah cảm ơn bạn! Tôi đã không sử dụng AlertDialog hỗ trợ.
masterwok

1

Nếu bạn giống tôi, bạn chỉ muốn sửa đổi một số màu trong AppCompat và màu duy nhất bạn cần thay đổi duy nhất trong hộp thoại là nền. Sau đó, tất cả những gì bạn cần làm là thiết lập một màu chocolorBackgroundFloating .

Đây là chủ đề cơ bản của tôi chỉ đơn giản là sửa đổi một số màu sắc không có chủ đề lồng nhau:

    <style name="AppTheme" parent="Theme.AppCompat">
        <item name="colorPrimary">@color/theme_colorPrimary</item>
        <item name="colorPrimaryDark">@color/theme_colorPrimaryDark</item>
        <item name="colorAccent">@color/theme_colorAccent</item>
        <item name="colorControlActivated">@color/theme_colorControlActivated</item>
        <item name="android:windowBackground">@color/theme_bg</item>
        <item name="colorBackgroundFloating">@color/theme_dialog_bg</item><!-- Dialog background color -->
        <item name="colorButtonNormal">@color/theme_colorPrimary</item>
        <item name="colorControlHighlight">@color/theme_colorAccent</item>
    </style>

-3
    <item name="editTextColor">@color/white</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">@color/gray</item>
    <item name="android:textColorPrimary">@color/gray</item>
    <item name="colorControlNormal">@color/gray</item>
    <item name="colorControlActivated">@color/white</item>
    <item name="colorControlHighlight">#30FFFFFF</item>
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.