Làm cách nào để thay đổi màu văn bản của nút hộp thoại mặc định trong Android 5


159

Tôi có nhiều hộp thoại cảnh báo trong ứng dụng của mình. Đó là một bố cục mặc định nhưng tôi đang thêm các nút tích cực và tiêu cực vào hộp thoại. Vì vậy, các nút có được màu văn bản mặc định của Android 5 (màu xanh lá cây). Tôi đã cố gắng thay đổi nó mà không thành công. Bất kỳ ý tưởng làm thế nào để thay đổi màu văn bản đó?

Hộp thoại tùy chỉnh của tôi:

public class MyCustomDialog extends AlertDialog.Builder {

    public MyCustomDialog(Context context,String title,String message) {
        super(context);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        View viewDialog = inflater.inflate(R.layout.dialog_simple, null, false);

        TextView titleTextView = (TextView)viewDialog.findViewById(R.id.title);
        titleTextView.setText(title);
        TextView messageTextView = (TextView)viewDialog.findViewById(R.id.message);
        messageTextView.setText(message);

        this.setCancelable(false);

        this.setView(viewDialog);

    } }

Tạo hộp thoại:

MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage);
builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ...
                        }
}).show();

NegButton đó là nút hộp thoại mặc định và lấy màu xanh lục mặc định từ Android 5 Lollipop.

Cảm ơn nhiều

Hộp thoại tùy chỉnh với nút màu xanh lá cây


Hầu như trùng lặp câu hỏi / câu trả lời stackoverflow.com/a/29810469/2291 mà tôi cảm thấy có thể áp dụng nhiều hơn những ngày này.
Jon Adams

Câu trả lời:


190

Bạn có thể thử tạo AlertDialogđối tượng trước, sau đó sử dụng nó để thiết lập để thay đổi màu của nút và sau đó hiển thị nó. (Lưu ý rằng trên builderđối tượng thay vì gọi, show()chúng tôi gọi create()để lấy AlertDialogđối tượng:

//1. create a dialog object 'dialog'
MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage); 
AlertDialog dialog = builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    ...
                }

            }).create();

//2. now setup to change color of the button
dialog.setOnShowListener( new OnShowListener() {
    @Override
    public void onShow(DialogInterface arg0) {
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(COLOR_I_WANT);
    }
});

dialog.show()

Lý do bạn phải thực hiện onShow()và không thể lấy nút đó sau khi bạn tạo hộp thoại là nút chưa được tạo.

Tôi đã thay đổi AlertDialog.BUTTON_POSITIVEđể AlertDialog.BUTTON_NEGATIVEphản ánh sự thay đổi trong câu hỏi của bạn. Mặc dù thật kỳ lạ khi nút "OK" sẽ là nút âm. Thông thường nó là nút tích cực.


Cảm ơn bạn đã trả lời, nhưng tôi không có phương pháp đó trong AlertDialog. Xem bài viết cập nhật của tôi.
Nhà phát triển FOM

5
Phương thức đó nằm trong lớp AlertDialog, không phải lớp Builder. Vì vậy, thay vì gọi Builder.show (), bạn có thể Builder.create (), trả về lớp AlertDialog. Sau đó, bạn thiết lập trình nghe và sau đó gọi show () trên đối tượng
AlertDialog

3
Nhưng phải có một cách khác để làm điều này. Có vẻ như đó là một màu từ chủ đề, chúng ta có thể thay đổi nó thông qua chủ đề / phong cách không?
milosmns

Đây là hoàn hảo. Chỉ cần thử trong Xamarin.Android và nó hoạt động hoàn hảo. Cảm ơn rât nhiều.
perozzo

278

Đây là một cách tự nhiên để làm điều đó với các phong cách:

Nếu bạn AppThemeđược thừa kế từ Theme.MaterialComponents, thì:

<style name="AlertDialogTheme" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#00f</item>
</style>

Nếu bạn AppThemeđược thừa kế từ Theme.AppCompat:

<style name="AlertDialogTheme" parent="ThemeOverlay.AppCompat.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#00f</item>
</style>

Sử dụng của bạn AlertDialogThemetrong của bạnAppTheme

<item name="alertDialogTheme">@style/AlertDialogTheme</item>

hoặc trong nhà xây dựng

androidx.appcompat.app.AlertDialog.Builder(context, R.style.AlertDialogTheme)

34
Tôi đã phải thay đổi nútBarNegativeButtonStyle thành android: buttonBarNegativeButtonStyle và buttonBarPositiveButtonStyle thành android: buttonBarPositiveButtonStyle. Sau đó, nó hoạt động (API 21+).
Vlad

23
Hãy nhớ sử dụng android.support.v7.app.AlertDialog thay vì android.app.AlertDialog. Sai lầm nhảm nhí khiến tôi mất 2 giờ
thanhbinh84

2
Tôi đã phải thay đổi cha mẹ của AlertDialogTheme thành "Base.Theme.AppCompat.Light.Dialog.Alert". Và loại bỏ nútBarNegativeButtonStyle & buttonBarPositiveButtonStyle. Đồng thời thêm vào <item name = "colorAccent"> @ color / dashboard_red_color </ item> trong AlertDialogTheme. nd hoạt động hoàn hảo.
zephyr

3
Điều này không hoạt động khi sử dụng thư viện tài liệu mới com.google.android.material:material:1.0.0-beta01và tôi đang sử dụng Theme.M vật liệu tổng hợp.Light.Dialog.Alert
Sanjeev

2
@LX cập nhật câu trả lời để bao gồm chủ đề thành phần vật liệu
Alexander Perfilyev

120

Màu của các nút và văn bản khác cũng có thể được thay đổi thông qua chủ đề:

giá trị-21 / style.xml

<style name="AppTheme" parent="...">
  ...
  <item name="android:timePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="android:datePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="android:alertDialogTheme">@style/AlertDialogCustom</item>
</style>

<style name="AlertDialogCustom" parent="android:Theme.Material.Light.Dialog.Alert">
  <item name="android:colorPrimary">#00397F</item>
  <item name="android:colorAccent">#0AAEEF</item>
</style>

Kết quả:

Hộp thoại Bảng chọn ngày


1
Hiện tại tôi không biết cách chỉ thay đổi màu hộp kiểm hoặc màu nút. Màu nhấn thay đổi cả hai.
peceps

4
Tôi thích cách tiếp cận này, nhưng tôi cảm thấy câu trả lời tại stackoverflow.com/a/29810469/2291 là một cách gọn gàng hơn để làm điều đó.
Jon Adams

12
Để có được điều này để làm việc trong dự án của tôi, tôi đã phải loại bỏ android:phần này android:alertDialogThemekhỏi android:colorAccent.
ban-geengineering

2
Có tiền tố android: trên các giá trị tùy thuộc vào nơi bạn đặt tệp style.xml, trong các giá trị hoặc trong giá trị-vXX
peceps

1
Để thực hiện công việc này với AppCompat và thư mục giá trị đơn giản, chỉ cần thực hiện theo các thay đổi được đề xuất bởi @ ban-Geoengineering
Felix

94

Giải pháp đơn giản nhất là:

dialog.show(); //Only after .show() was called
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(neededColor);
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(neededColor);

4
Các trường đó không nên được tham chiếu từ biến không tĩnh, AlertDialog.BUTTON_NEGATIVEv.v.
Joe Maher

Đây là cách tốt nhất và đơn giản nhất để làm điều này. Lưu ý rằng tôi đã không sử dụng "tạo" thay vì lấy hộp thoại sau chương trình (). Giống như hộp thoại AlertDialog = builder.show ();
Stephen McCormick

2
Trong khi giải pháp này có thể hoạt động, về mặt logic thì nó còn thiếu sót. Điều xảy ra ở đây là lần đầu tiên bạn hiển thị hộp thoại, và sau đó bạn thay đổi diện mạo của nó. Phụ thuộc vào việc triển khai cơ bản (có thể thay đổi theo thời gian) và hiệu suất của thiết bị, về mặt lý thuyết bạn có thể thấy một "nhấp nháy" nơi người dùng thấy một hộp thoại xuất hiện và sau đó nhanh chóng thay đổi giao diện.
trungdinhtrong

31

Có hai cách để thay đổi màu nút hộp thoại.

Cách cơ bản

Nếu bạn chỉ muốn thay đổi trong một hoạt động, hãy viết hai dòng dưới đây sau alertDialog.show();

alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorPrimary));
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorPrimaryDark));

Đề xuất

Tôi sẽ khuyên bạn nên thêm một chủ đề cho AlertDialogtrong styles.xml, do đó bạn không cần phải viết mã tương tự một lần nữa và một lần nữa trong từng hoạt động / cuộc gọi thoại. Bạn chỉ có thể tạo một kiểu và áp dụng chủ đề đó trên hộp thoại. Vì vậy, bất cứ khi nào bạn muốn thay đổi màu của hộp AlertDialog, chỉ cần thay đổi màu trong tệp kiểu tệp và tất cả các hộp thoại sẽ được cập nhật trong toàn bộ ứng dụng.

<style name="AlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">@color/colorPrimary</item>
</style>

Và áp dụng chủ đề trong AlertDialog.Builder

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme);

Câu trả lời này là sạch nhất trong khi vẫn đúng.
Big_Chair

11

Nếu bạn muốn thay đổi màu văn bản của nút (dương, âm, trung tính), chỉ cần thêm vào kiểu hộp thoại tùy chỉnh của bạn:

<item name="colorAccent">@color/accent_color</item>

Vì vậy, kiểu hộp thoại của bạn phải trông như thế này:

<style name="AlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:textColor">@android:color/black</item>
    <item name="colorAccent">@color/topeka_accent</item>
</style>

6
<style name="AlertDialogCustom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:colorPrimary">#00397F</item>
    <item name="android:textColorPrimary">#22397F</item>
    <item name="android:colorAccent">#00397F</item>
    <item name="colorPrimaryDark">#22397F</item>
</style>

Màu của các nút và văn bản khác cũng có thể được thay đổi bằng appcompat:


Theme.AppCompat.Light.Dialog.Alert hoạt động độc đáo để thay đổi màu nút thành màu trắng.
Leo K

6
  1. Trong chủ đề / phong cách của ứng dụng, hãy thêm các dòng sau:

    <item name="android:buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="android:buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <item name="android:buttonBarNeutralButtonStyle">@style/NeutralButtonStyle</item>
  2. Sau đó thêm các kiểu sau:

    <style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">@color/red</item>
    </style>
    
    <style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">@color/red</item>
    </style>
    
    <style name="NeutralButtonStyle" 
    parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">#00f</item>
    </style>

Việc sử dụng phương pháp này khiến cho việc thiết lập chủ đề trong trình xây dựng AlertDialog không cần thiết.


4

Cũng như một ghi chú bên lề:

Màu sắc của các nút (và toàn bộ kiểu dáng) cũng phụ thuộc vào chủ đề hiện tại có thể khác nhau khi bạn sử dụng

android.app.AlertDialog.Builder builder = new AlertDialog.Builder()

hoặc là

android.support.v7.app.AlertDialog.Builder builder = new AlertDialog.Builder()

(Tốt hơn để sử dụng cái thứ hai)


3

Đây là cách bạn làm điều đó: Cách đơn giản

// Initializing a new alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.message);
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        doAction();
    }
});
builder.setNegativeButton(R.string.cancel, null);

// Create the alert dialog and change Buttons colour
AlertDialog dialog = builder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface arg0) {
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.red));
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.blue));
        //dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(getResources().getColor(R.color.black));
    }
});
dialog.show();

1

Đối với tôi thì khác, tôi đã sử dụng một chủ đề nút

<style name="ButtonLight_pink" parent="android:Widget.Button">
      <item name="android:background">@drawable/light_pink_btn_default_holo_light</item>
      <item name="android:minHeight">48dip</item>
      <item name="android:minWidth">64dip</item>
      <item name="android:textColor">@color/tab_background_light_pink</item>
    </style>

và bởi vì

android: văn bản màu

có màu trắng ở đó tôi không thấy bất kỳ văn bản nút nào (nút Dialog về cơ bản cũng là các nút). chúng tôi đi, thay đổi nó, sửa nó

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.