Como posso mudar a cor do título do AlertDialog e a cor da linha abaixo dele

109

Eu mudei a cor de um título AlertDialog usando este comando

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

Mas quero mudar a cor da linha que aparece sob o título; Como eu posso fazer isso ?

Observação: não quero usar um layout personalizado

captura de tela do efeito desejado

Mohammed Subhi Sheikh Quroush
fonte
1
há um motivo específico pelo qual você deseja evitar layouts personalizados? Que estipulações adicionais você tem que precisam ser cumpridas?
Daniel Smith
4
Você pode realmente mudar a cor do título do AlertDialog por um hack muito simples. stackoverflow.com/a/21401181/855884
MatrixDev

Respostas:

134

Infelizmente, essa não é uma tarefa particularmente simples de realizar. Em minha resposta aqui , eu detalho como ajustar a cor de um ListSeparatorapenas verificando o estilo pai usado pelo Android, criando uma nova imagem e criando um novo estilo baseado no original. Infelizmente, ao contrário do ListSeparatorestilo de,AlertDialog temas são internos e, portanto, não podem ser referenciados como estilos pais. Não há maneira fácil de mudar essa pequena linha azul! Portanto, você precisa recorrer à criação de diálogos personalizados.

Se isso não é sua xícara de chá ... não desista! Fiquei muito perturbado porque não havia uma maneira fácil de fazer isso, então configurei um pequeno projeto no github para criar diálogos de estilo holo personalizados rapidamente (assumindo que o telefone suporta o estilo holo). Você pode encontrar o projeto aqui: https://github.com/danoz73/QustomDialog

Deve facilmente permitir a passagem do azul chato para o laranja emocionante!

insira a descrição da imagem aqui

O projeto é basicamente um exemplo de uso de um construtor de diálogo personalizado e, no exemplo, criei uma visualização personalizada que parecia atender ao exemplo de endereço IP que você deu em sua pergunta original.

Com QustomDialog, para criar uma caixa de diálogo básica (título, mensagem) com uma cor diferente desejada para o título ou divisor, você usa o seguinte código:

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 para adicionar um layout personalizado (digamos, para adicionar o pequeno endereço IP EditText), você adiciona

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

para o construtor com um layout que você projetou (o exemplo de IP pode ser encontrado no github). Eu espero que isso ajude. Muito obrigado a Joseph Earl e sua resposta aqui .

Daniel Smith
fonte
2
Por que o Android ainda não suportava a alteração das cores da caixa de diálogo de alerta, devo usar outra caixa de diálogo ou onde está o problema?
Mohammed Subhi Sheikh Quroush
3
O Android provavelmente está tentando impor padrões de IU consistentes, então é provavelmente por isso que isso é tão desafiador. Esta é a melhor solução que poderia criar para te ajudar. Espero que seja útil, ou pelo menos interessante e informativo :)
Daniel Smith
2
olá Daniel. Obrigado por compartilhar seu trabalho. É muito útil. Estou enfrentando um problema ao implementar isso. Na verdade, quero adicionar a escolha de um único item usando setItemsnesta caixa de diálogo personalizada. Quando eu adiciono a lista, ele realmente muda o título abaixo da lista. Como resolver este problema.
Dory
3
bem, talvez ainda não ... Estou enfrentando o problema do título abaixo da lista ... desculpe.
dentex
1
@DanielSmith hi! Bom trabalho, mas você encontrou a solução para 'título abaixo da lista' como mencionado acima
Shirish Herwade
74

Cor do divisor:

É um pouco hackeado, mas funciona muito bem para mim e sem nenhuma biblioteca externa (pelo menos no 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));

Você pode encontrar mais ids de diálogo no arquivo alert_dialog.xml . Por exemplo. android:id/alertTitlepara mudar a cor do título ...

ATUALIZAÇÃO: Cor do título

Hack para alterar a cor do título:

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
fonte
Mesmo no KitKat, encontro android.util.AndroidRuntimeException: requestFeature() must be called before adding contentaqui.
Konrad Reiche de
Eu uso esse pedaço de código em muitos lugares no meu aplicativo e em todos os lugares ele funciona bem. Eu só sei sobre problemas em DialogFragmentque a cor do título não é id, android:id/alertTitlemas não encontrei o correto.
mmrmartin
2
@platzhirsch, em minha classe DialogFragment customizada, evitei o problema requestFeature () executando o código de customização em onStart (). Você pode acessar a caixa de diálogo usando getDialog ().
arlomedia
1
Apenas como um alerta para futuros usuários que possam encontrar isso; por alguma razão, quando eu uso apenas um diálogo genérico, tenho que usar "title" como meu nome de identificador em vez de "alertTitle". Não tenho certeza se isso é mencionado em algum outro lugar, mas apenas pensei em acrescentar minha parte na esperança de ajudar: P
zgc7009
3
estou chegando NullPointerExceptionnosetTextColor()
Abhi
21

verifique se isso é útil para você ...

public void setCustomTitle (View customTitleView)

você obtém detalhes no seguinte 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" />

insira a descrição da imagem aqui

Sr. Sandy
fonte
Eu tento fazer isso, mas ainda tenho a linha azul em meu TextView
Mohammed Subhi Sheikh Quroush
eu tenho algum código. que colocou uma resposta após "Editar". você tenta isso.
Sr. Sandy
10

Isso definirá a cor do título, ícone e divisor. Obrigada a mudar com qualquer nova versão do 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);
    }
}

Lembre-se de chamar dialog.show () antes de chamar este método.

Jared Rummler
fonte
@Vlado, você está usando o appcompat? Nesse caso, isso pode não funcionar.
Jared Rummler
9

Seguindo o código-fonte do Dialog , descobri que Title é gerado em Class MidWindowaumentando o dialog_title_holo.xmllayout. então o Id de mTitleViewé titlee o Id do divisor é titleDivider.

podemos acessar o Id titlesimplesmente por android.R.id.title.

e acesso ao Id de titleDividerporResources.getSystem().getIdentifier("titleDivider","id", "android");

O código final que usei para alterar a direção do título e a mudança de cor é:

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
fonte
Esta é uma resposta completa! Usando android.R.id.title para alterar o título também!
Andreas Lymbouras 25/10/2014
Ótima resposta, me ajudou muito! Tive que mudar: TextView mTitle = (TextView) findViewById (android.R.id.title); para: TextView mTitle = (TextView) dialog.findViewById (android.R.id.title); para que isso funcione.
Jan Ziesse
Este funcionou para mim, estou usando uma Activity que herda @android: style / Theme.Dialog. Pode personalizar a linha divisória e a cor do título. +1
voghDev
4

Se você não quer uma "biblioteca" para isso, pode usar este hack malvado:

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

Isso foi testado e funciona em 4.x; não testado em, mas se minha memória for boa, deve funcionar para 2.xe 3.x

Benjamin Vadon
fonte
Isso funciona muito bem para 4.xi não tentei os outros também, então vou dar uma chance e confirmar
kandroidj
getDialog () me dá um erro "O método getDialog () é indefinido para o tipo MainActivity" ele me pede para criar um método
Zen
4

Na classe onCreateView, coloco o seguinte:

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 é um link para nosso arquivo colors.xml que armazena todas as cores. Também d.setTitlefornece uma maneira hacky de definir a cor do título.

LG365
fonte
1

Se você estiver criando um layout personalizado para a caixa de diálogo de alerta

então você pode adicionar assim facilmente para mudar a cor

<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
fonte
1

Se estiver usando um layout de título personalizado , você pode usá-lo como alertDialog.setCustomTitle(customTitle);

Exemplo

No thread de IU, use um diálogo como:

 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
fonte
Eu quero mudar a cor da linha dentro da elipse vermelha
Mohammed Subhi Sheikh Quroush
1

Aqui está outra solução (com base nas respostas sugeridas) que lida com o estilo dos diálogos em uma classe sem a necessidade de se preocupar com o estado do diálogo quando você altera o estilo - o diálogo já pode ser mostrado ou apenas inicializado.

Exemplo de uso:

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

Implementação:

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
fonte
0

Continuando com esta resposta: https://stackoverflow.com/a/15285514/1865860 , fiz um bifurcação do repositório github de @ daniel-smith e fiz algumas melhorias:

  • exemplo melhorado de atividade
  • layouts melhorados
  • setItemsmétodo fixo
  • adicionaram divisórias em items_list
  • dispensar diálogos ao clicar
  • suporte para itens desabilitados em setItemsmétodos
  • listItem toque de feedback
  • mensagem de diálogo rolável

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

dentex
fonte
0

Em vez de usar divisor na caixa de diálogo, use a visualização no layout personalizado e defina o layout como layout personalizado na caixa de diálogo.

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
fonte
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
fonte
-1

Caso você esteja usando a extensão da caixa de diálogo, use:

requestWindowFeature(Window.FEATURE_NO_TITLE);
Mahesh
fonte