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

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

alert.setTitle( Html.fromHtml("Set IP Address")); 

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

Nota: non voglio usare un layout personalizzato

screenshot dell'effetto desiderato

Sfortunatamente, questo non è un compito particolarmente semplice da realizzare. Nella mia risposta qui , dettaglio come regolare il colore di un ListSeparator semplicemente controllando lo stile genitore utilizzato da Android, creando una nuova immagine e creando un nuovo stile basato sull’originale. Sfortunatamente, a differenza dello stile di AlertDialog , i temi di AlertDialog sono interni e pertanto non possono essere referenziati come stili principali. Non c’è un modo semplice per cambiare quella piccola linea blu! Quindi è necessario ricorrere a windows di dialogo personalizzate.

Se proprio non è la tua tazza di tè … non mollare! Ero molto turbato dal fatto che non esistesse un modo semplice per farlo, quindi ho creato un piccolo progetto su github per creare dialoghi in stile holo rapidamente personalizzati (supponendo che il telefono supporti lo stile di Holo). Puoi trovare il progetto qui: https://github.com/danoz73/QustomDialog

Dovrebbe facilmente abilitare passare dal noioso blu all’arancia emozionante!

inserisci la descrizione dell'immagine qui

Il progetto è fondamentalmente un esempio di utilizzo di un generatore di windows di dialogo personalizzato e, nell’esempio, ho creato una visualizzazione personalizzata che sembrava soddisfare l’esempio di indirizzo IP fornito nella 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 (per esempio, per aggiungere il piccolo indirizzo IP EditText ), aggiungi

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

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

Colore del divisore:

È un pasticcio, 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)); 

Puoi trovare altri ID di dialogo nel file alert_dialog.xml . Per esempio. android:id/alertTitle per 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)); 

controlla questo è utile per te …

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

inserisci la descrizione dell'immagine qui

Questo imposterà il colore per il titolo, l’icona e il divisore. Imansible 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.

Seguendo il codice sorgente della finestra di dialogo , ho trovato che il titolo è generato nella class MidWindow gonfiando il layout dialog_title_holo.xml . quindi l’ID di mTitleView è il title e l’ID del divisore è titleDivider .

possiamo accedere all’ID del title semplicemente da android.R.id.title .

e accesso a Id of titleDivider da Resources.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)); 

Se non vuoi una “libreria” per questo, puoi usare questo cattivo trucco:

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

Se si sta creando un layout personalizzato per la finestra di dialogo di avviso

quindi puoi aggiungere in questo modo facilmente per cambiare il colore

  >  

Se usi layout di titolo personalizzato, puoi usarlo come alertDialog.setCustomTitle (customTitle);

Per esempio

 on UI thread used dialog like 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"?>        

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

  • migliorata attività di esempio
  • layout migliorati
  • metodo fisso setItems
  • aggiunto divisori in items_list
  • chiudere le windows di dialogo al clic
  • supporto per gli elementi disabilitati nei metodi setItems
  • listItem touch feedback
  • messaggio di dialogo scorrevole

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

Ho trovato un’altra soluzione che gestisce lo stile dei dialoghi in un unico punto e non devi preoccuparti di quando lo applichi: la finestra di dialogo mostra / non viene mostrata, il che può causare un errore (dovresti chiamare requestFocus o qualcosa del genere; P).

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

* 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 */ public static 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); } }}

Nella class onCreateView, ho messo questo:

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

colorPrimary link al nostro file colors.xml che memorizza tutti i colors. Inoltre d.setTitle fornisce un modo hacky per impostare il colore del titolo.

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

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

Nel caso si stia utilizzando l’estensione della finestra di dialogo l’uso:

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