Wie kann ich die Farbe des AlertDialog-Titels und die Farbe der Zeile darunter ändern?

109

Mit diesem Befehl habe ich die Farbe eines AlertDialog-Titels geändert

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

Aber ich möchte die Farbe der Linie ändern, die unter dem Titel erscheint. wie kann ich das machen ?

Hinweis: Ich möchte kein benutzerdefiniertes Layout verwenden

Screenshot des gewünschten Effekts

Mohammed Subhi Sheikh Quroush
quelle
1
Gibt es einen bestimmten Grund, warum Sie benutzerdefinierte Layouts vermeiden möchten? Welche zusätzlichen Bestimmungen müssen erfüllt werden?
Daniel Smith
4
Sie können die Farbe des AlertDialog-Titels durch einen sehr einfachen Hack ändern. stackoverflow.com/a/21401181/855884
MatrixDev

Antworten:

134

Leider ist dies keine besonders einfache Aufgabe. In meiner Antwort hier beschreibe ich, wie Sie die Farbe von a anpassen können, ListSeparatorindem Sie einfach den von Android verwendeten übergeordneten Stil überprüfen, ein neues Bild erstellen und einen neuen Stil basierend auf dem Original erstellen. Im Gegensatz zum ListSeparatorStil des AlertDialogThemas sind die Themen leider intern und können daher nicht als übergeordnete Stile bezeichnet werden. Es gibt keine einfache Möglichkeit, diese kleine blaue Linie zu ändern! Daher müssen Sie auf benutzerdefinierte Dialoge zurückgreifen.

Wenn das nicht deine Tasse Tee ist ... gib nicht auf! Ich war sehr beunruhigt darüber, dass es keinen einfachen Weg gab, dies zu tun. Deshalb habe ich ein kleines Projekt auf Github eingerichtet, um schnell angepasste Dialoge im Holo-Stil zu erstellen (vorausgesetzt, das Telefon unterstützt den Holo-Stil). Sie finden das Projekt hier: https://github.com/danoz73/QustomDialog

Es sollte leicht möglich sein, von langweiligem Blau zu aufregendem Orange zu wechseln!

Geben Sie hier die Bildbeschreibung ein

Das Projekt ist im Grunde ein Beispiel für die Verwendung eines benutzerdefinierten Dialog-Builders. In diesem Beispiel habe ich eine benutzerdefinierte Ansicht erstellt, die dem IP-Adressbeispiel zu entsprechen scheint, das Sie in Ihrer ursprünglichen Frage angegeben haben.

Mit QustomDialog, um einen grundlegenden Dialog (Titel, Nachricht) mit einer gewünschten anderen Farbe für den Titel oder den Teiler zu erstellen, verwenden Sie den folgenden Code:

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

Und um ein benutzerdefiniertes Layout hinzuzufügen (z. B. um die kleine IP-Adresse EditTexthinzuzufügen), fügen Sie hinzu

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

an den Builder mit einem von Ihnen entworfenen Layout (das IP-Beispiel finden Sie im Github). Ich hoffe das hilft. Vielen Dank an Joseph Earl und seine Antwort hier .

Daniel Smith
quelle
2
Warum hat Android das Ändern der Farben des Warnungsdialogs immer noch nicht unterstützt, sollte ich einen anderen Dialog verwenden oder wo liegt das Problem?
Mohammed Subhi Sheikh Quroush
3
Android versucht wahrscheinlich, konsistente UI-Muster durchzusetzen, weshalb dies wahrscheinlich eine große Herausforderung darstellt. Dies ist die beste Lösung, die ich erstellen kann, um Ihnen zu helfen. Ich hoffe, Sie finden es nützlich oder zumindest interessant und informativ :)
Daniel Smith
2
Hallo Daniel. Vielen Dank für Ihre Arbeit. Es ist sehr hilfreich. Ich stehe vor einem Problem bei der Umsetzung. Eigentlich möchte ich die Auswahl einzelner Elemente setItemsin diesem benutzerdefinierten Dialogfeld hinzufügen . Wenn ich die Liste hinzufüge, wird der Titel tatsächlich unter die Liste verschoben. So lösen Sie dieses Problem.
Dory
3
Nun, vielleicht noch nicht ganz ... Ich stehe vor dem Problem des Titels unter der Liste ... Entschuldigung.
Dentex
1
@ DanielSmith hi! Gute Arbeit, aber haben Sie die Lösung für "Titel unter der Liste" gefunden, wie oben erwähnt
Shirish Herwade
74

Teilerfarbe:

Es ist ein bisschen hacken, aber es funktioniert großartig für mich und es funktioniert ohne externe Bibliothek (zumindest unter Android 4.4).

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

Weitere Dialog-IDs finden Sie in der Datei alert_dialog.xml . Z.B. android:id/alertTitlezum Ändern der Titelfarbe ...

UPDATE: Titelfarbe

Hack zum Ändern der Titelfarbe:

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));
mmrmartin
quelle
Sogar auf KitKat treffe ich android.util.AndroidRuntimeException: requestFeature() must be called before adding contenthier.
Konrad Reiche
Ich verwende diesen Code an vielen Stellen in meiner App und überall funktioniert er einwandfrei. Ich weiß nur über Probleme Bescheid, bei DialogFragmentdenen die Titelfarbe keine ID hat, android:id/alertTitleaber ich habe nicht die richtige gefunden.
mmrmartin
2
@platzhirsch, in meiner benutzerdefinierten DialogFragment-Klasse habe ich das Problem requestFeature () vermieden, indem ich den Anpassungscode in onStart () ausgeführt habe. Sie können dort mit getDialog () auf den Dialog zugreifen.
Arlomedia
1
Nur als Heads-up für zukünftige Benutzer, die darauf stoßen könnten; Wenn ich nur einen generischen Dialog verwende, muss ich aus irgendeinem Grund "title" als Bezeichnernamen anstelle von "alertTitle" verwenden. Ich bin mir nicht sicher, ob dies irgendwo anders erwähnt wird, dachte aber nur, ich würde mein bisschen in der Hoffnung hinzufügen, zu helfen: P
zgc7009
3
Ich komme NullPointerExceptionamsetTextColor()
Abhi
21

Überprüfen Sie, ob dies für Sie nützlich ist ...

public void setCustomTitle (View customTitleView)

Details erhalten Sie über den folgenden Link.

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

Geben Sie hier die Bildbeschreibung ein

Mr. Sandy
quelle
Ich versuche es, aber ich habe immer noch die blaue Linie unter meiner Textansicht
Mohammed Subhi Sheikh Quroush
Ich habe einen Code. die Antwort nach "Bearbeiten". du versuchst das
Mr. Sandy
10

Dadurch wird die Farbe für Titel, Symbol und Teiler festgelegt. Mit jeder neuen Android-Version ändern.

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

Denken Sie daran, dialog.show () aufzurufen, bevor Sie diese Methode aufrufen.

Jared Rummler
quelle
@Vlado benutzt du Appcompat? Wenn ja, funktioniert dies möglicherweise nicht.
Jared Rummler
9

Durch Befolgen des Dialog-Quellcodes stellte ich fest, dass der Titel in der Klasse MidWindowdurch Aufblasen des dialog_title_holo.xmlLayouts generiert wird . so ist die ID von mTitleViewist titleund die ID von Teiler ist titleDivider.

wir können auf id von titleeinfach durch zugreifen android.R.id.title.

und Zugriff auf ID von titleDividervonResources.getSystem().getIdentifier("titleDivider","id", "android");

Der letzte Code, mit dem ich die Richtung des Titels und die Farbe geändert habe, ist:

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));
mrd abd
quelle
Dies ist eine vollständige Antwort! Verwenden Sie android.R.id.title, um auch den Titel zu ändern!
Andreas Lymbouras
Tolle Antwort, hat mir sehr geholfen! Ich musste ändern: TextView mTitle = (TextView) findViewById (android.R.id.title); an: TextView mTitle = (TextView) dialog.findViewById (android.R.id.title); damit dies funktioniert.
Jan Ziesse
Dieser hat für mich funktioniert, ich verwende eine Aktivität, die @android: style / Theme.Dialog erbt. Könnte die Trennlinie und die Titelfarbe anpassen. +1
voghDev
4

Wenn Sie dafür keine "Bibliothek" wollen, können Sie diesen schlechten Hack verwenden:

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

Dies wurde getestet und arbeitet an 4.x; nicht unter getestet, aber wenn mein Gedächtnis gut ist, sollte es für 2.x und 3.x funktionieren

Benjamin Vadon
quelle
Dies funktioniert gut für 4.xi habe die anderen auch nicht ausprobiert, also werde ich sie ausprobieren und bestätigen
kandroidj
getDialog () gibt mir einen Fehler "Die Methode getDialog () ist für den Typ MainActivity undefiniert" fordert mich auf, eine Methode zu erstellen
Zen
4

In der Klasse onCreateView habe ich Folgendes eingefügt:

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 verweist auf unsere Datei colours.xml, in der alle Farben gespeichert sind. Auch d.setTitleein hacky Weg , um die Titelfarbe einzustellen.

lg365
quelle
1

Wenn Sie ein benutzerdefiniertes Layout für den Warndialog erstellen

dann können Sie auf diese Weise leicht hinzufügen, um die Farbe zu ändern

<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>
Janmejoy
quelle
1

Wenn Sie ein benutzerdefiniertes Titellayout verwenden , können Sie es wie folgt verwenden alertDialog.setCustomTitle(customTitle);

Beispiel

Verwenden Sie im UI-Thread einen Dialog wie:

 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>
Amol Wadekar
quelle
Ich möchte die Farbe der Linie innerhalb der roten Ellipse ändern
Mohammed Subhi Sheikh Quroush
1

Hier ist eine andere Lösung (basierend auf vorgeschlagenen Antworten), die das Styling der Dialoge in einer Klasse übernimmt, ohne sich um den Status des Dialogs kümmern zu müssen, wenn Sie den Stil ändern. Der Dialog kann bereits angezeigt oder nur initialisiert werden.

Anwendungsbeispiel:

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

Implementierung:

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);
    }
}}
GMan
quelle
0

Ausgehend von dieser Antwort: https://stackoverflow.com/a/15285514/1865860 , gabelte ich das nette Github-Repo von @ daniel-smith und nahm einige Verbesserungen vor:

  • verbessertes Beispiel Aktivität
  • verbesserte Layouts
  • feste setItemsMethode
  • Trennwände hinzugefügt in items_list
  • Dialoge beim Klicken schließen
  • Unterstützung für deaktivierte Elemente in setItemsMethoden
  • listItem Touch-Feedback
  • scrollbare Dialognachricht

Link: https://github.com/dentex/QustomDialog

Dentex
quelle
0

Verwenden Sie anstelle der Verwendung des Teilers im Dialogfeld die Ansicht im benutzerdefinierten Layout und legen Sie das Layout im Dialogfeld als benutzerdefiniertes Layout fest.

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();
}
Velayutham M.
quelle
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)
Samet ÖZTOPRAK
quelle
-1

Wenn Sie den Dialog erweitern, verwenden Sie Folgendes:

requestWindowFeature(Window.FEATURE_NO_TITLE);
Mahesh
quelle