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.