AlertDialog başlığının rengini ve altındaki çizginin rengini nasıl değiştirebilirim


109

Bu komutu kullanarak bir AlertDialog başlığının rengini değiştirdim

alert.setTitle( Html.fromHtml("<font color='#FF7F27'>Set IP Address</font>"));

Ama başlığın altında görünen çizginin rengini değiştirmek istiyorum; bunu nasıl yapabilirim ?

Not: Özel bir düzen kullanmak istemiyorum

istenen efektin ekran görüntüsü


1
Özel düzenlerden kaçınmanızın belirli bir nedeni var mı? Karşılanması gereken ek ne tür şartlarınız var?
Daniel Smith

4
Aslında AlertDialog başlığının rengini çok basit bir hack ile değiştirebilirsiniz. stackoverflow.com/a/21401181/855884
MatrixDev

Yanıtlar:


134

Ne yazık ki, bu özellikle başarılması kolay bir iş değil. Buradaki cevabımda, ListSeparatorsadece Android tarafından kullanılan ana stili kontrol ederek, yeni bir görüntü oluşturarak ve orijinali temel alan yeni bir stil oluşturarak a'nın rengini nasıl ayarlayacağımı ayrıntılarıyla anlatıyorum . Ne yazık ki, ListSeparatorstilin aksine , AlertDialogtemalar içseldir ve bu nedenle ana stil olarak gösterilemez. O küçük mavi çizgiyi değiştirmenin kolay bir yolu yok! Bu nedenle, özel diyaloglar yapmaya başvurmanız gerekir.

Bu senin çayın değilse ... değilse pes etmeyin! Bunu yapmanın kolay bir yolu olmadığı için çok rahatsız oldum, bu yüzden hızla özelleştirilmiş sanal stil diyaloglar yapmak için github üzerinde küçük bir proje hazırladım (telefonun Holo stilini desteklediğini varsayarak). Projeyi burada bulabilirsiniz: https://github.com/danoz73/QustomDialog

Sıkıcı maviden heyecan verici turuncuya geçişi kolayca sağlamalıdır!

görüntü açıklamasını buraya girin

Proje temelde özel bir iletişim kutusu oluşturucu kullanmanın bir örneğidir ve bu örnekte, orijinal sorunuzda verdiğiniz IP Adresi örneğine hitap eden özel bir görünüm oluşturdum.

İle QustomDialog , başlık veya ayırıcı için istenen farklı renkte temel bir iletişim kutusu (başlık, mesaj) oluşturmak için aşağıdaki kodu kullanırsınız:

private String HALLOWEEN_ORANGE = "#FF7F27";

QustomDialogBuilder qustomDialogBuilder = new QustomDialogBuilder(v.getContext()).
    setTitle("Set IP Address").
    setTitleColor(HALLOWEEN_ORANGE).
    setDividerColor(HALLOWEEN_ORANGE).
    setMessage("You are now entering the 10th dimension.");

qustomDialogBuilder.show();

Ve özel bir düzen eklemek için (örneğin, küçük IP adresini eklemek için EditText ),

setCustomView(R.layout.example_ip_address_layout, v.getContext())

tasarladığınız bir yerleşim düzenine sahip kurucuya (IP örneği github'da bulunabilir). Umarım bu yardımcı olur. Joseph Earl'e ve buradaki cevabına çok teşekkürler .


2
android neden hala uyarı iletişim kutusunun renklerini değiştirmeyi desteklemiyordu, başka bir iletişim kutusu kullanmalı mıyım ya da sorun nerede?
Muhammed Subhi Şeyh Quroush

3
Android muhtemelen tutarlı kullanıcı arayüzü kalıplarını uygulamaya çalışıyor, bu yüzden bunun bu kadar zor olmasının nedeni budur. Size yardımcı olmak için oluşturabileceğim en iyi çözüm budur. Umarım yararlı bulursunuz veya en azından ilginç ve bilgilendirici olursunuz :)
Daniel Smith

2
Merhaba Daniel. Çalışmanızı paylaştığınız için teşekkürler. Oldukça faydalıdır. Bunu uygularken bir sorunla karşı karşıyayım. Aslında setItemsbu özel iletişim kutusunda kullanarak tek öğe seçeneği eklemek istiyorum . Listeyi eklediğimde, aslında listenin altındaki başlığı kaydırıyor. Bu problem nasıl çözülür?
Dory

3
iyi, belki henüz tam olarak değil ... Listenin altındaki başlık sorunuyla karşı karşıyayım ... üzgünüm
dentex

1
@DanielSmith merhaba! İyi iş, ancak yukarıda belirtildiği gibi 'listenin altındaki başlık' için bir çözüm buldunuz mu
Shirish Herwade

74

Bölücü rengi:

Biraz hack, ama benim için harika çalışıyor ve herhangi bir harici kitaplık olmadan çalışıyor (en azından Android 4.4'te).

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.dialog)
       .setIcon(R.drawable.ic)
       .setMessage(R.string.dialog_msg);
//The tricky part
Dialog d = builder.show();
int dividerId = d.getContext().getResources().getIdentifier("android:id/titleDivider", null, null);
View divider = d.findViewById(dividerId);
divider.setBackgroundColor(getResources().getColor(R.color.my_color));

Alert_dialog.xml'de daha fazla iletişim kutusu kimliği bulabilirsiniz. dosyasında . Örneğin. android:id/alertTitlebaşlık rengini değiştirmek için ...

GÜNCELLEME: Başlık rengi

Başlık rengini değiştirmek için hack:

int textViewId = d.getContext().getResources().getIdentifier("android:id/alertTitle", null, null);
TextView tv = (TextView) d.findViewById(textViewId);
tv.setTextColor(getResources().getColor(R.color.my_color));

KitKat'ta bile buraya rastladım android.util.AndroidRuntimeException: requestFeature() must be called before adding content.
Konrad Reiche

Bu kod parçasını uygulamamın birçok yerinde kullanıyorum ve her yerde sorunsuz çalışıyor. Sadece DialogFragmentbaşlık renginin kimliğinin olmadığı sorunları biliyorum android:id/alertTitleama doğru olanı bulamadım.
mmrmartin

2
@platzhirsch, özel DialogFragment sınıfımda, özelleştirme kodunu onStart () içinde çalıştırarak requestFeature () sorununu önledim. Oradaki iletişim kutusuna getDialog () kullanarak erişebilirsiniz.
arlomedia

1
Bununla karşılaşabilecek gelecekteki kullanıcılar için bir uyarı olarak; bazı nedenlerden dolayı, sadece genel bir İletişim Kutusu kullandığımda, "alertTitle" yerine tanımlayıcı adım olarak "başlık" ı kullanmam gerekiyor. Bundan başka bir yerde bahsedilip bahsedilmediğinden emin değilim, ancak yardımcı olmak umuduyla kendi
payımı

3
i alıyorum NullPointerExceptionatsetTextColor()
Abhi

21

bunun sizin için yararlı olduğunu kontrol edin ...

public void setCustomTitle (View customTitleView)

Aşağıdaki linkten detaylar alacaksınız.

http://developer.android.com/reference/android/app/AlertDialog.Builder.html#setCustomTitle%28android.view.View%29

CustomDialog.java

Dialog alert = new Dialog(this);
    alert.requestWindowFeature(Window.FEATURE_NO_TITLE);
    alert.setContentView(R.layout.title);
    TextView msg = (TextView)alert.findViewById(R.id.textView1);
    msg.setText("Hello Friends.\nIP address : 111.111.1.111");
    alert.show();

title.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Set IP address"
    android:textColor="#ff0000"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<ImageView 
    android:layout_width="fill_parent"
    android:layout_height="2dp"
    android:layout_marginTop="5dp"
    android:background="#00ff00"
    />
<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#775500"
    android:textAppearance="?android:attr/textAppearanceLarge" />

görüntü açıklamasını buraya girin


Bunu deniyorum ama hala TextView'ımın altında mavi çizgi var
Mohammed Subhi Sheikh Quroush

bazı kodum var. "Düzenle" den sonra yanıt verdi. bunu dene.
Bay Sandy

10

Bu, başlık, simge ve ayırıcı için rengi belirleyecektir. Herhangi bir yeni Android sürümüyle değişmeye bağlı.

public static void colorAlertDialogTitle(AlertDialog dialog, int color) {
    int dividerId = dialog.getContext().getResources().getIdentifier("android:id/titleDivider", null, null);
    if (dividerId != 0) {
        View divider = dialog.findViewById(dividerId);
        divider.setBackgroundColor(color);
    }

    int textViewId = dialog.getContext().getResources().getIdentifier("android:id/alertTitle", null, null);
    if (textViewId != 0) {
        TextView tv = (TextView) dialog.findViewById(textViewId);
        tv.setTextColor(color);
    }

    int iconId = dialog.getContext().getResources().getIdentifier("android:id/icon", null, null);
    if (iconId != 0) {
        ImageView icon = (ImageView) dialog.findViewById(iconId);
        icon.setColorFilter(color);
    }
}

Bu yöntemi çağırmadan önce dialog.show () işlevini çağırmayı unutmayın.


@Vlado appcompat kullanıyor musunuz? Eğer öyleyse, bu işe yaramayabilir.
Jared Rummler

9

Dialog kaynak kodunu takip ederek MidWindow, dialog_title_holo.xmldüzeni şişirerek Başlığın Sınıfta oluşturulduğunu buldum . bu nedenle, kimliği mTitleVieweşittir titleve bölen kimliği eşittir titleDivider.

Id'ye titlebasitçe erişebiliriz android.R.id.title.

ve Id erişim titleDividerileResources.getSystem().getIdentifier("titleDivider","id", "android");

Başlığın Yönünü ve rengini değiştirmek için kullandığım son kod:

TextView mTitle = (TextView)findViewById(android.R.id.title);
mTitle.setGravity(Gravity.RIGHT|Gravity.CENTER_VERTICAL);
int x = Resources.getSystem().getIdentifier("titleDivider","id", "android");
View titleDivider = findViewById(x);
titleDivider.setBackgroundColor(getContext().getResources().getColor(R.color.some_color));

Bu tam bir cevap! Android.R.id.title kullanarak başlığı da değiştirin!
Andreas Lymbouras

Harika cevap, bana çok yardımcı oldu! Değiştirmem gerekiyordu: TextView mTitle = (TextView) findViewById (android.R.id.title); to: TextView mTitle = (TextView) dialog.findViewById (android.R.id.title); bunun işe yaraması için.
Jan Ziesse

Bu benim için çalıştı, @android: style / Theme.Dialog'u miras alan bir Activity kullanıyorum. Bölücü çizgiyi ve başlık rengini özelleştirebilir. +1
voghDev

4

Bunun için bir "kitaplık" istemiyorsanız, bu kötü hack'i kullanabilirsiniz:

((ViewGroup)((ViewGroup)getDialog().getWindow().getDecorView()).getChildAt(0)) //ie LinearLayout containing all the dialog (title, titleDivider, content)
.getChildAt(1) // ie the view titleDivider
.setBackgroundColor(getResources().getColor(R.color.yourBeautifulColor));

Bu test edildi ve 4.x üzerinde çalışıyor; altında test edilmedi, ancak hafızam iyiyse 2.x ve 3.x için çalışmalı


Bu, 4.xi için harika çalışıyor, diğerlerini de denemedi, bu yüzden onlara bir deneyip onaylayacağım
kandroidj

getDialog () bana bir hata veriyor "getDialog () yöntemi MainActivity türü için tanımsız" bir yöntem oluşturmamı istiyor
Zen

4

OnCreateView sınıfında şunu koyuyorum:

Dialog d = getDialog();
    d.setTitle(Html.fromHtml("<font color='#EC407A'>About</font>"));
    int dividerId = d.getContext().getResources().getIdentifier("android:id/titleDivider", null, null);
    View divider = d.findViewById(dividerId);
    divider.setBackgroundColor(getResources().getColor(R.color.colorPrimary));

colorPrimary, tüm renkleri saklayan colors.xml dosyamıza bağlantılar. Ayrıca d.setTitlebaşlık rengini ayarlamak için karmaşık bir yol sağlar.


1

Uyarı iletişim kutusu için özel Düzen oluşturuyorsanız

daha sonra rengini değiştirmek için bu şekilde kolayca ekleyebilirsiniz

<LinearLayout
    android:id="@+id/DialogTitleBorder"
    android:layout_width="fill_parent"
    android:layout_height="1dip"
    android:layout_below="@id/mExitDialogDesc"
    android:background="#4BBAE3"            <!--change color easily -->
    >

</LinearLayout>

1

Senin kullanılıyorsa özel başlık düzen o zaman gibi kullanabilirsiniz alertDialog.setCustomTitle(customTitle);

Misal

UI iş parçacığında aşağıdaki gibi iletişim kutusu kullanın:

 LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
 View customTitle = inflater.inflate(R.layout.customtitlebar, null);
 AlertDialog.Builder d = new AlertDialog.Builder(this);
 d.setCustomTitle(customTitle);
 d.setMessage("Message");
 d.setNeutralButton("OK", null);
 d.show();

customtitlebar.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="#525f67">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/ic_launcher"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true" >
    </ImageView>

    <TextView
        android:id="@+id/customtitlebar"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:textColor="#ffffff"
        android:text="Title Name"
        android:padding="3px"
        android:textStyle="bold" 
        android:layout_toRightOf="@id/icon"
        android:layout_alignParentTop="true"
        android:gravity="center_vertical"/>

     <ImageView
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="#ff0000" 
        android:layout_below="@id/icon"><!-- This is line below the title -->
    </ImageView>

</RelativeLayout>

Kırmızı elipsin içindeki çizginin rengini değiştirmek istiyorum
Mohammed Subhi Sheikh Quroush

1

Stili değiştirdiğinizde iletişim kutusunun durumu hakkında endişelenmenize gerek kalmadan bir sınıftaki diyalogların stilini işleyen başka bir çözüm (önerilen cevaplara göre) - diyalog zaten gösterilebilir veya yeni başlatılabilir.

Kullanım örneği:

AlertDialog.Builder builder = new AlertDialog.Builder(context);
AlertDialog dialog = builder.create(); //or builder.show()
DialogViewDecorator.decorate(dialog, android.R.color.holo_red_light); //can also set the defaut color in the class

Uygulama:

public class DialogViewDecorator {

private static final
@ColorRes int DEFAULT_TITLE_DIVIDER_COLOR = android.R.color.holo_orange_light;

public static void decorate(Dialog dialog) {
    decorate(dialog, DEFAULT_TITLE_DIVIDER_COLOR);
}

/**
 * Sets the title divider color when the view is shown by setting DialogInterface.OnShowListener on the dialog.
 * <p/>
 * If you want to do other things onShow be sure to extend OnDecoratedDialogShownListener(call super.show(...)!)
 * and call {@link #decorate(Dialog, int, OnDecoratedDialogShownListener)}.
 *
 * @param dialog
 * @param titleDividerColor
 */
public static void decorate(Dialog dialog, final int titleDividerColor) {
    decorate(dialog, titleDividerColor, new OnDecoratedDialogShownListener(titleDividerColor));
}

/**
 * Method for setting a extended implementation of OnDecoratedDialogShownListener. Don't forget to call super
 * or the titleDividerColor wont be applied!
 *
 * @param dialog
 * @param titleDividerColor
 * @param OnShowListener
 * @param <T>
 */
public static <T extends OnDecoratedDialogShownListener> void decorate(Dialog dialog, int titleDividerColor, T OnShowListener) {
    if (dialog == null || titleDividerColor <= 0) { return; }

    if (dialog.isShowing()) {
        setTitleDividerColor(dialog, titleDividerColor);
    } else {
        dialog.setOnShowListener(OnShowListener);
    }
}

private static void setTitleDividerColor(DialogInterface dialogInterface, int titleDividerColor) {
    try {
        Dialog dialog = (Dialog) dialogInterface;
        int dividerId = dialog.getContext().getResources().getIdentifier("android:id/titleDivider", null, null);
        View divider = dialog.findViewById(dividerId);
        if (divider != null) {
            divider.setBackgroundColor(dialog.getContext().getResources().getColor(titleDividerColor));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}


public static class OnDecoratedDialogShownListener implements DialogInterface.OnShowListener {
    private int titleDividerColor;

    public OnDecoratedDialogShownListener() {
        this.titleDividerColor = DEFAULT_TITLE_DIVIDER_COLOR;
    }

    public OnDecoratedDialogShownListener(int titleDividerColor) {
        this.titleDividerColor = titleDividerColor;
    }

    @Override
    public void onShow(DialogInterface dialogInterface) {
        setTitleDividerColor(dialogInterface, titleDividerColor);
    }
}}

0

Bu yanıttan devam ederek: https://stackoverflow.com/a/15285514/1865860 , @ daniel-smith'den güzel github deposunu çatalladım ve bazı iyileştirmeler yaptım:

  • geliştirilmiş örnek Etkinlik
  • geliştirilmiş düzenler
  • sabit setItems yöntem
  • bölücüler eklendi items_list
  • tıklandığında diyalogları kapat
  • setItemsyöntemlerde devre dışı bırakılan öğeler için destek
  • listItem dokunma geri bildirimi
  • kaydırılabilir iletişim mesajı

bağlantı: https://github.com/dentex/QustomDialog


0

Bölücü iletişim kutusunda kullanmak yerine, özel mizanpajdaki görünümü kullanın ve mizanpajı iletişim kutusunda özel mizanpaj olarak ayarlayın.

custom_popup.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

    <com.divago.view.TextViewMedium
        android:id="@+id/txtTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:paddingBottom="10dp"
        android:paddingTop="10dp"
        android:text="AlertDialog"
        android:textColor="@android:color/black"
        android:textSize="20sp" />

    <View
        android:id="@+id/border"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_below="@id/txtTitle"
        android:background="@color/txt_dark_grey" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/border"
        android:scrollbars="vertical">

        <com.divago.view.TextViewRegular
            android:id="@+id/txtPopup"
            android:layout_margin="15dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </ScrollView>
</RelativeLayout>

activity.java:

public void showPopUp(String title, String text) {

    LayoutInflater inflater = getLayoutInflater();
    View alertLayout = inflater.inflate(R.layout.custom_popup, null);

    TextView txtContent = alertLayout.findViewById(R.id.txtPopup);
    txtContent.setText(text);

    TextView txtTitle = alertLayout.findViewById(R.id.txtTitle);
    txtTitle.setText(title);

    AlertDialog.Builder alert = new AlertDialog.Builder(this);
    alert.setView(alertLayout);
    alert.setCancelable(true);

    alert.setPositiveButton("Done", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });

    AlertDialog dialog = alert.create();
    dialog.show();
}

0
    ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.BLACK);

    String title = context.getString(R.string.agreement_popup_message);
    SpannableStringBuilder ssBuilder = new SpannableStringBuilder(title);
    ssBuilder.setSpan(
            foregroundColorSpan,
            0,
            title.length(),
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    );

AlertDialog.Builder alertDialogBuilderUserInput = new AlertDialog.Builder(context);
alertDialogBuilderUserInput.setTitle(ssBuilder)

-1

İletişim kutusunu genişletmeyi kullanıyorsanız, şunları kullanın:

requestWindowFeature(Window.FEATURE_NO_TITLE);
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.