android 5에서 기본 대화 상자 텍스트 색상을 변경하는 방법


160

내 앱에 많은 경고 대화 상자가 있습니다. 기본 레이아웃이지만 대화 상자에 양수 및 음수 버튼을 추가하고 있습니다. 따라서 버튼은 기본 텍스트 색상 인 Android 5 (녹색)를 얻습니다. 나는 성공하지 않고 그것을 바꾸려고 노력했다. 해당 텍스트 색상을 변경하는 방법에 대한 아이디어가 있습니까?

내 사용자 정의 대화 상자 :

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

    } }

대화 상자 만들기 :

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

음수 버튼은 기본 대화 상자이며 Android 5 Lollipop에서 기본 녹색을 사용합니다.

많은 감사

녹색 버튼이있는 사용자 정의 대화 상자


요즘 더 적용 할 수 있다고 생각되는 질문 / 응답 stackoverflow.com/a/29810469/2291 이 거의 중복 되었습니다.
Jon Adams

답변:


191

당신은 만들려고 할 수 있습니다 AlertDialog첫 번째 개체를 선택한 후 버튼의 색상을 변경 설정을 사용하여 다음을 보여줍니다. ( builder객체를 호출하는 대신 객체를 show()호출 create()하기 위해 호출 AlertDialog합니다.

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

당신이 그것을해야하고 onShow()대화를 만든 후에 해당 버튼을 얻을 수없는 이유 는 버튼이 아직 생성되지 않았기 때문입니다.

나는 변화 AlertDialog.BUTTON_POSITIVE하는 AlertDialog.BUTTON_NEGATIVE질문의 변화를 반영하기 위해. "OK"버튼이 음수 버튼 일 가능성은 희박합니다. 일반적으로 양수 버튼입니다.


답변 해 주셔서 감사하지만 AlertDialog에 해당 방법이 없습니다. 내 업데이트 된 게시물을 참조하십시오.
FOMDeveloper 2016 년

5
이 메소드는 Builder 클래스가 아니라 AlertDialog 클래스에 있습니다. 따라서 Builder.show ()를 호출하는 대신 AlertDialog 클래스를 반환하는 Builder.create ()를 사용할 수 있습니다. 그런 다음 리스너를 설정 한 다음 AlertDialog 객체에서 show ()를 호출합니다
trungdinhtrong

3
그러나이를 수행하는 다른 방법이 있어야합니다. 테마의 색상 인 것 같습니다. 테마 / 스타일을 통해 변경할 수 있습니까?
milosmns 2016 년

이것은 완벽 해요. Xamarin.Android에서 방금 시도했으며 완벽하게 작동합니다. 대단히 감사합니다.
perozzo

280

스타일로 자연스럽게 처리하는 방법은 다음과 같습니다.

AppTheme에서 상속받은 경우 Theme.MaterialComponents:

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

AppTheme에서 상속받은 경우 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>

당신의 AlertDialogTheme에서 사용AppTheme

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

또는 생성자

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

34
buttonBarNegativeButtonStyle을 android : buttonBarNegativeButtonStyle로, buttonBarPositiveButtonStyle을 android : buttonBarPositiveButtonStyle로 변경해야했습니다. 그런 다음 작동했습니다 (API 21+).
Vlad

23
android.app.AlertDialog 대신 android.support.v7.app.AlertDialog를 사용해야합니다. 헛소리 실수는 2 시간 걸렸다
thanhbinh84

2
AlertDialogTheme의 부모에서 "Base.Theme.AppCompat.Light.Dialog.Alert"로 변경해야했습니다. buttonBarNegativeButtonStyle & buttonBarPositiveButtonStyle을 제거하십시오. 또한 AlertDialogTheme에서 <item name = "colorAccent"> @ color / dashboard_red_color </ item>에 추가하십시오. nd는 완벽하게 작동합니다.
zephyr

3
이것은 새로운 재료 라이브러리를 사용할 때 작동하지 않으며 com.google.android.material:material:1.0.0-beta01Theme.MaterialComponents.Light.Dialog.Alert
Sanjeev를

2
@LX 소재 부품 테마를 포함하는 대답을 업데이트
알렉산더 Perfilyev을

120

버튼 및 기타 텍스트의 색상은 테마를 통해 변경할 수도 있습니다.

values-21 / styles.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>

결과:

대화 날짜 선택기


1
현재 확인란 색상이나 버튼 색상 만 변경하는 방법을 모르겠습니다. 악센트 색상이 둘 다 변경됩니다.
peceps

4
나는이 접근법을 좋아했지만 stackoverflow.com/a/29810469/2291 의 대답 은 약간 깔끔한 방법입니다.
Jon Adams

12
내 프로젝트에서 작업이를 얻으려면, 나는 제거해야 android:로부터 부품을 android:alertDialogTheme하고부터 android:colorAccent.
ban-geoengineering

2
값에 android : 접두어를 갖는 것은 styles.xml을 어디에 값을 넣거나 값에 넣는 지에 따라 다릅니다. vXX
peceps

1
AppCompat 및 간단한 값 폴더를 사용하여이 작업을 수행하려면 @ ban-geoengineering이 제안한 변경 사항을 따르십시오.
Felix

94

가장 간단한 해결책은 다음과 같습니다.

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

4
이러한 필드는 정적 변수가 아닌 변수에서 참조해서는 안됩니다 AlertDialog.BUTTON_NEGATIVE.
Joe Maher

이것이 가장 쉽고 간단한 방법이었습니다. "create"를 사용하지 않고 show () 이후에 대화 상자를 잡았습니다. AlertDialog 대화 상자와 같이 = builder.show ();
Stephen McCormick

2
이 솔루션은 작동 할 수 있지만 논리적으로는 결함이 있습니다. 여기서 일어나는 일은 먼저 대화 상자를 표시 한 다음 모양을 변경하는 것입니다. 기본 구현 (시간이 지남에 따라 변경 될 수 있음)과 장치의 성능에 따라, 사용자에게 대화 상자가 나타난 다음 모양을 빠르게 변경하는 "깜박임"이 표시 될 수 있습니다.
trungdinhtrong

31

대화 상자 버튼 색상을 변경하는 방법에는 두 가지가 있습니다.

기본 방법

활동을 변경하려면 다음 두 줄을 적어 두십시오. alertDialog.show();

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

추천

각 활동 / 대화 호출에서 동일한 코드를 반복해서 작성할 필요 AlertDialogstyles.xml없도록에 테마를 추가하는 것이 좋습니다 . 스타일을 만들고 대화 상자에서 해당 테마를 적용하면됩니다. 따라서 AlertDialog 상자의 색상을 변경하려면 styles.xml에서 색상을 변경하면 모든 대화 상자가 전체 응용 프로그램에서 업데이트됩니다.

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

그리고 테마를 적용하십시오 AlertDialog.Builder

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

이 답변은 여전히 ​​정확하면서 가장 깨끗합니다.
Big_Chair

11

버튼 텍스트 색상을 변경하려면 (양수, 음수, 중립) 사용자 정의 대화 상자 스타일에 추가하십시오.

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

따라서 대화 스타일은 다음과 같아야합니다.

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

appcompat를 사용하여 버튼 및 기타 텍스트의 색상을 변경할 수도 있습니다.


Theme.AppCompat.Light.Dialog.Alert는 버튼 색상을 흰색으로 변경하는 데 효과적입니다.
Leo K

6
  1. 앱의 테마 / 스타일에서 다음 줄을 추가하십시오.

    <item name="android:buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="android:buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <item name="android:buttonBarNeutralButtonStyle">@style/NeutralButtonStyle</item>
  2. 그런 다음 다음 스타일을 추가하십시오.

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

이 방법을 사용하면 AlertDialog 빌더에서 테마를 설정하지 않아도됩니다.


4

부수적으로 :

버튼의 색상 (및 전체 스타일)은 현재 테마에 따라 달라지며, 둘 중 하나를 사용할 때 다소 다를 수 있습니다

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

또는

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

(두 번째 것을 사용하는 것이 좋습니다)


3

방법은 다음과 같습니다. 간단한 방법

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

나를 위해 그것은 다른 버튼 테마를 사용

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

때문에

android : textColor

나는 거기에 흰색이었다. .. 나는 어떤 버튼 텍스트도 보지 않았다 (대화 버튼은 기본적으로 버튼이기도하다). 우리는 가서 수정하고 고쳤습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.