AppCompat 22.1 ve üzeri sürümlerden yeni AlertDialog nasıl kullanılır ve stil verilir


154

Ben varsayılan android AlertDialogappCompat-22.1 dahil yeni bir geçiş yapmaya çalışıyorum Şimdiye kadar sadece kullanmak için android.support.v7.app.AlertDialogpaketi almak zorunda anlıyorum.

Ama nasıl şekillendirebilirim? Örneğin, pozitif / negatif düğme renkleri, başlık rengi, mesaj rengi ve arka plan rengi değiştirilsin mi?

Yanıtlar:


448

Oluştururken AlertDialogkullanılacak bir tema ayarlayabilirsiniz.

Örnek - İletişim Kutusu Oluşturma

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 - Özel stil

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

Sonuç

tarz uyarı

Düzenle

Başlığın Görünüşünü değiştirmek için aşağıdakileri yapabilirsiniz. İlk önce yeni bir stil ekleyin:

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

daha sonra bu stile başvurmanız yeterlidir MyAlertDialogStyle:

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

Bu yolla textColormesaj android:textColorPrimaryiçin farklı ve stil aracılığıyla başlık için farklı bir tanımlayabilirsiniz .


2
Teşekkür ederim @reVerse Bir şey daha. Birçok kütüphane farklı Başlık ve Metin renklerine sahip olmasına izin verir. Bunun da burada mümkün olup olmadığını biliyor musunuz?
— ThanosFisherman

3
Tekrar merhaba! İletinin metin boyutunu değiştirmenin bir yolu var mı?
— ThanosFisherman

1
@ThanosF Ne yazık ki bunu yapan herhangi bir xml özelliğinin farkında değilim. Ama kesinlikle Java-Code ile mümkün.
— Ters

2
@summers Jup. Temel olarak bu fikir appcompat-v7- daha yeni bileşenlerin API Seviye 7'ye (Android 2.1) geriye doğru uyumluluğunu getiriyor
— Mart'ta

1
Düğmelerin metin renginin 21+ üzerinde çalışması için "MyAlertDialogStyle" için bir android: buttonStyle öğesi ve özel düğme stilinde bir android: textColor öğesi vardı.
— Tim Autin

61

Tüm uygulama için bir tema kullanmak ve İletişim Kutunuzu biçimlendirmek için ikinci parametreyi kullanmamak

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

Temamda bir renk vurgusu kullanarak uygulamamda alertDialog'un colorAccent temalı düğmelerini gösterme Temaya bir iletişim stili eklemek zorundayım.


API 10 (android 2.3), muhtemelen yalnızca API 11+ üzerinde çalışmaz.
— Oliv

2
Belki API 15 ve üstü sürümlerde. Sadece API 15+ üzerinde yeni bir projeye başlıyorum, 4'ten önce Android'in 2015'te modası geçtiğini düşünüyorum.
— neoteknic

@Oliv com.android.support:design:23.2.1 bağımlılığını kullanarak API 10 üzerinde çalışır
— passerby

IDEA, API 21+ uygulamasının Base.Theme.AppCompat.Light.Dialog.Alert üzerinde 'com.android.support:design:22.2.1' kullanarak colorAccent kullanmak gerektiğini söylüyor
— Felipe Andrade

@Felipe Andrade Alway en son SDK sürümünü hedefliyorsa, işe yaramalı! Min api 15 ve hedef 25 tasarımlı bir projektifim var: 22.x eski, 25.1.x ve daha fazlasını kullanın
— neoteknic

19

Yeni android.support.v7.app.AlertDialog'u kullanmak ve düğmeler için farklı renklere sahip olmak ve ayrıca özel bir düzene sahip olmak istiyorsanız, https://gist.github.com/JoachimR/6bfbc175d5c8116d411e'ye bir göz atın

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

resim açıklamasını buraya girin


Bu harika! Thank you
— ThanosFisherman

Teşekkürler, benim için çalışmanın tek yolu bu, ama onay kutusunun rengini de nasıl alabilirim? Uygulamamda, üzerinden oluşturulan radyo düğmelerinin listesini içeren bir iletişim kutusu var Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener). Bağdaştırıcıyı alt sınıflara ayırmak ve oradaki görünümü değiştirmek gibi bir şey yapmak istemiyorum.
— Gabor

Ağır toplar her zaman işe yarar! Vurgu rengini değiştirmeyi her zaman reddeden 2 asi düğmesine bakmak için bunu kullanmak zorunda kaldım!
— 17'de

7

@ReVerse cevabını takip et ama benim durumumda, zaten benim AppThemegibi bir mülküm vardı

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

Yani benim diyalogum şöyle görünecek
resim açıklamasını buraya girin

Tarafından çözdüm

1) İçe aktarma android.app.AlertDialogdeğerini android.support.v7.app.AlertDialog
2 olarak değiştirin) 2 özelliği AppThemenull değeriyle geçersiz kıldım

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

Umarım başkalarına yardım eder

resim açıklamasını buraya girin


Ah teşekkürler! AlertDialog desteğini kullanmıyordum.
— masterwok

1

Benim gibi iseniz, sadece AppCompat'taki bazı renkleri değiştirmek istiyorsunuz ve iletişim kutusunda benzersiz bir şekilde değiştirmeniz gereken tek renk arka plan. O zaman tek yapmanız gereken bir renk ayarlamaktır colorBackgroundFloating.

İşte bazı renkleri iç içe temalar olmadan değiştiren temel temam:

    <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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.