Come posso cambiare il colore del titolo di AlertDialog e il colore della linea sottostante


109

Ho cambiato il colore di un titolo di AlertDialog usando questo comando

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

Ma voglio cambiare il colore della linea che appare sotto il titolo; Come lo posso fare ?

Nota: non desidero utilizzare un layout personalizzato

screenshot dell'effetto desiderato


1
c'è un motivo specifico per cui stai cercando di evitare layout personalizzati? Quali disposizioni aggiuntive hai che devono essere soddisfatte?
Daniel Smith

4
Puoi effettivamente cambiare il colore del titolo di AlertDialog con un semplice trucco. stackoverflow.com/a/21401181/855884
MatrixDev

Risposte:


134

Sfortunatamente, questo non è un compito particolarmente semplice da realizzare. Nella mia risposta qui , descrivo in dettaglio come regolare il colore di a ListSeparatorsemplicemente controllando lo stile genitore utilizzato da Android, creando una nuova immagine e creando un nuovo stile basato sull'originale. Sfortunatamente, a differenza dello ListSeparatorstile di, i AlertDialogtemi sono interni e quindi non è possibile fare riferimento come stili principali. Non c'è un modo semplice per cambiare quella piccola linea blu! Quindi è necessario ricorrere alla creazione di finestre di dialogo personalizzate.

Se questa non è la tua tazza di tè ... non arrenderti! Ero molto turbato dal fatto che non ci fosse un modo semplice per farlo, quindi ho impostato un piccolo progetto su GitHub per creare finestre di dialogo in stile olografico rapidamente personalizzate (supponendo che il telefono supporti lo stile Holo). Puoi trovare il progetto qui: https://github.com/danoz73/QustomDialog

Dovrebbe facilmente consentire il passaggio dal blu noioso all'arancione eccitante!

inserisci qui la descrizione dell'immagine

Il progetto è fondamentalmente un esempio dell'utilizzo di un generatore di finestre di dialogo personalizzato e nell'esempio ho creato una visualizzazione personalizzata che sembrava soddisfare l'esempio dell'indirizzo IP che fornisci nella tua domanda originale.

Con QustomDialog, per creare una finestra di dialogo di base (titolo, messaggio) con un colore diverso desiderato per il titolo o il divisore, si utilizza il seguente codice:

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

E per aggiungere un layout personalizzato (ad esempio, per aggiungere il piccolo indirizzo IP EditText), aggiungi

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

al builder con un layout che hai progettato (l'esempio IP può essere trovato nel github). Spero che aiuti. Molte grazie a Joseph Earl e alla sua risposta qui .


2
perché Android non supportava ancora la modifica dei colori della finestra di dialogo di avviso, dovrei usare un'altra finestra di dialogo o dov'è il problema?
Mohammed Subhi Sheikh Quroush

3
Probabilmente Android sta cercando di applicare modelli di interfaccia utente coerenti, quindi è probabilmente questo il motivo per cui è così impegnativo. Questa è la migliore soluzione che potrei creare per aiutarti. Spero che lo trovi utile, o almeno interessante e informativo :)
Daniel Smith

2
Ciao, Daniel. grazie per aver condiviso il tuo lavoro. È molto utile. Sto affrontando un problema nell'attuazione di questo. In realtà voglio aggiungere la scelta di un singolo elemento utilizzando setItemsin questa finestra di dialogo personalizzata. Quando aggiungo l'elenco, sposta effettivamente il titolo sotto l'elenco. Come risolvere questo problema.
Dory

3
beh, forse non ancora del tutto ... sto affrontando il problema del titolo sotto la lista ... scusate.
dentex

1
@DanielSmith ciao! Ottimo lavoro, ma hai trovato la soluzione per 'titolo sotto la lista' come menzionato sopra
Shirish Herwade

74

Colore divisorio:

È un po 'un trucco, ma funziona benissimo per me e funziona senza alcuna libreria esterna (almeno su 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));

È possibile trovare più ID delle finestre di dialogo nel file alert_dialog.xml . Per esempio. android:id/alertTitleper cambiare il colore del titolo ...

AGGIORNAMENTO: colore del titolo

Hack per cambiare il colore del titolo:

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

Anche su KitKat mi imbatto android.util.AndroidRuntimeException: requestFeature() must be called before adding contentqui.
Konrad Reiche

Uso questo pezzo di codice in molti punti della mia app e ovunque funzioni correttamente. Conosco solo problemi con il DialogFragmentcolore del titolo che non ha l'ID android:id/alertTitlema non ho trovato quello corretto.
mmrmartin

2
@platzhirsch, nella mia classe DialogFragment personalizzata, ho evitato il problema requestFeature () eseguendo il codice di personalizzazione in onStart (). È possibile accedere alla finestra di dialogo tramite getDialog ().
arlomedia

1
Proprio come un avvertimento per i futuri utenti che potrebbero imbattersi in questo; per qualche ragione, quando uso solo una finestra di dialogo generica devo usare "title" come nome identificativo invece di "alertTitle". Non sono sicuro che sia menzionato altrove, ma ho solo pensato di aggiungere la mia parte nella speranza di aiutare: P
zgc7009

3
sto arrivando NullPointerExceptionalsetTextColor()
Abhi

21

controlla che ti sia utile ...

public void setCustomTitle (View customTitleView)

ottieni dettagli dal seguente 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" />

inserisci qui la descrizione dell'immagine


Ci provo ma ho ancora la linea blu sotto il mio TextView
Mohammed Subhi Sheikh Quroush

ho del codice. che ha messo in risposta dopo "Modifica". prova questo.
Mr.Sandy

10

Questo imposterà il colore per il titolo, l'icona e il divisore. Vincolato a cambiare con qualsiasi nuova versione di Android.

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

Ricorda di chiamare dialog.show () prima di chiamare questo metodo.


@Vlado stai usando appcompat? In tal caso, potrebbe non funzionare.
Jared Rummler

9

Seguendo il codice sorgente del dialogo , ho scoperto che il titolo viene generato in Class MidWindowgonfiando il dialog_title_holo.xmllayout. quindi l'Id di mTitleViewè titlee l'Id di divisore è titleDivider.

possiamo accedere a Id di titlesemplicemente da android.R.id.title.

e l'accesso all'ID di titleDividerdaResources.getSystem().getIdentifier("titleDivider","id", "android");

Il codice finale che ho usato per cambiare la direzione del titolo e cambiare colore è:

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

Questa è una risposta completa! Usando android.R.id.title anche per cambiare il titolo!
Andreas Lymbouras

Ottima risposta, mi ha aiutato molto! Ho dovuto cambiare: TextView mTitle = (TextView) findViewById (android.R.id.title); a: TextView mTitle = (TextView) dialog.findViewById (android.R.id.title); affinché funzioni.
Jan Ziesse

Questo ha funzionato per me, sto usando un'attività che eredita @android: style / Theme.Dialog. Potrebbe personalizzare la linea di divisione e il colore del titolo. +1
voghDev

4

Se non vuoi una "libreria" per questo, puoi usare questo hack male:

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

Questo è stato testato e funziona su 4.x; non testato sotto, ma se la mia memoria è buona dovrebbe funzionare per 2.xe 3.x.


Funziona benissimo per 4.xi, non ho provato nemmeno gli altri, quindi proverò a confermarlo
kandroidj

getDialog () mi da un errore "Il metodo getDialog () non è definito per il tipo MainActivity" mi chiede di creare un metodo
Zen

4

Nella classe onCreateView, ho inserito questo:

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 si collega al nostro file colors.xml che memorizza tutti i colori. d.setTitleFornisce anche un modo hacky per impostare il colore del titolo.


1

Se stai creando un layout personalizzato per la finestra di dialogo di avviso

quindi puoi aggiungere facilmente in questo modo per cambiare il colore

<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

Se stai usando un layout del titolo personalizzato, puoi usarlo come alertDialog.setCustomTitle(customTitle);

Esempio

Sul thread dell'interfaccia utente usa una finestra di dialogo come:

 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>

Voglio cambiare il colore della linea all'interno dell'ellisse rossa
Mohammed Subhi Sheikh Quroush

1

Ecco un'altra soluzione (basata sulle risposte suggerite) che gestisce lo stile delle finestre di dialogo in una classe senza doversi preoccupare dello stato della finestra di dialogo quando si modifica lo stile: la finestra di dialogo può essere già visualizzata o semplicemente inizializzata.

Esempio di utilizzo:

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

Implementazione:

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

Continuando da questa risposta: https://stackoverflow.com/a/15285514/1865860 , ho biforcato il bel repository github da @ daniel-smith e ho apportato alcuni miglioramenti:

  • Attività di esempio migliorata
  • layout migliorati
  • fisso setItemsmetodo
  • aggiunti divisori in items_list
  • ignora le finestre di dialogo al clic
  • supporto per elementi disabilitati nei setItemsmetodi
  • listItem feedback tattile
  • messaggio di dialogo scorrevole

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


0

Invece di utilizzare il divisore nella finestra di dialogo, utilizzare la vista nel layout personalizzato e impostare il layout come layout personalizzato nella finestra di dialogo.

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

Nel caso in cui si utilizzi l'estensione della finestra di dialogo, utilizzare:

requestWindowFeature(Window.FEATURE_NO_TITLE);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.