appCompat 22.1 이상에서 새로운 AlertDialog를 사용하고 스타일을 지정하는 방법


154

기본 안드로이드 AlertDialog에서 appCompat-22.1에 포함 된 새로운 안드로이드로 마이그레이션하려고합니다. 지금까지 android.support.v7.app.AlertDialog패키지를 사용하기 위해서는 가져 오기 만하면 됩니다.

그러나 어떻게 스타일을 지정할 수 있습니까? 예를 들어 양수 / 음수 버튼 색상, 제목 색상, 메시지 색상 및 배경 색상을 변경 하시겠습니까?

답변:


448

를 만들 때 AlertDialog사용할 테마를 설정할 수 있습니다.

예-대화 상자 작성

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

styles.xml-사용자 정의 스타일

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

결과

스타일 경고

편집하다

제목의 모양을 변경하려면 다음을 수행하십시오. 먼저 새 스타일을 추가하십시오.

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

나중에 단순히이 스타일을 참조하십시오 MyAlertDialogStyle:

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

이런 방식으로 스타일을 통해 textColor메시지 android:textColorPrimary와 제목을 다르게 정의 할 수 있습니다 .


2
감사합니다 @reVerse 한 가지 더. 많은 라이브러리에서 다른 제목 및 텍스트 색상을 사용할 수 있습니다. 이것이 가능한지 아십니까?
ThanosFisherman

3
다시 이봐! 메시지의 텍스트 크기를 변경하는 방법이 있습니까?
ThanosFisherman

1
@ThanosF 불행히도 나는 이것을하는 xml 속성을 모른다. 그러나 Java 코드를 통해 가능합니다.
reVerse

2
@ 여름 up. 그것은 기본적으로 아이디어입니다 appcompat-v7-새로운 컴포넌트의 하위 호환성을 API 레벨 7 (Android 2.1)로 가져옵니다
초에 개정

1
21+에서 단추 텍스트 색상을 사용하려면 android : buttonStyle 항목을 "MyAlertDialogStyle"로, android : textColor 항목을 사용자 정의 버튼 스타일로 가져야했습니다.
Tim Autin

61

모든 응용 프로그램에 테마를 사용하고 두 번째 매개 변수를 사용하여 대화 상자의 스타일을 지정하지 마십시오

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

테마에서 색상 악센트를 사용하는 내 응용 프로그램에서 테마 colorAccent와 함께 alertDialog의 단추를 표시하지 않습니다. 테마에 대화 상자 스타일을 추가해야합니다.


API 10 (android 2.3)에서는 작동하지 않으며 아마도 API 11+에서만 작동합니다.
Oliv

2
API 15 이상일 수도 있습니다. API 15+에서만 새 프로젝트를 시작합니다. 2015 년 4 이전의 Android는 더 이상 사용되지 않는다고 생각합니다.
neoteknic

@Oliv 의존성 com.android.support:design:23.2.1을 사용하여 API 10에서 작동합니다.
passerby

IDEA는 API가 21+ 'com.android.support:design:22.2.1'를 사용 Base.Theme.AppCompat.Light.Dialog.Alert에 colorAccent를 사용하는 데 필요한 말한다
펠리페 엔드 레데

@Felipe Andrade는 항상 최신 SDK 버전을 목표로합니다. 나는 분 API (15)와 대상 (25) 디자인으로 인텔리 있습니다 22.x는 사용되지 않는 사용 25.1.x 및 더
neoteknic

19

새로운 android.support.v7.app.AlertDialog를 사용하고 버튼의 색상이 다르고 사용자 정의 레이아웃이 필요한 경우 https://gist.github.com/JoachimR/6bfbc175d5c8116d411e를 확인하십시오.

@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;
}

여기에 이미지 설명을 입력하십시오


대단해! 감사합니다
ThanosFisherman

고마워, 이것이 나를 위해 일한 유일한 방법이지만 확인란의 색상을 어떻게 얻을 수 있습니까? 내 응용 프로그램에는을 통해 생성 된 라디오 버튼 목록이있는 대화 상자가 Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener)있습니다. 어댑터를 서브 클래스 화하고 뷰를 조정하는 것까지 가고 싶지 않습니다.
Gabor

중포는 항상 작동합니다! 나는 이것을 강조 색으로 바꾸는 것을 거부하는 2 개의 반란군 버튼을 돌보아야했습니다!
rupps

7

@ reVerse 답변을 따르십시오.하지만 제 경우에는 이미 AppTheme비슷한 속성이 있습니다.

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

그래서 내 대화는
여기에 이미지 설명을 입력하십시오

나는 그것을 해결했다.

1)에서 가져 오기 android.app.AlertDialogandroid.support.v7.app.AlertDialog
2로 변경하십시오 .2 AppTheme값을 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);

다른 사람들을 돕기를 바랍니다.

여기에 이미지 설명을 입력하십시오


아 감사합니다! 지원 AlertDialog를 사용하지 않았습니다.
masterwok

1

나와 같은 경우 AppCompat에서 일부 색상을 수정하고 싶습니다. 대화 상자에서 고유하게 변경 해야하는 유일한 색상은 배경입니다. 그런 다음에 색상을 설정하기 만하면됩니다 colorBackgroundFloating.

중첩 된 테마없이 일부 색상을 간단히 수정하는 기본 테마는 다음과 같습니다.

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