Design de material não estilizando diálogos de alerta

161

Adicionei o design do material appCompat ao meu aplicativo e parece que as caixas de diálogo de alerta não estão usando minhas cores primária, primária, escura ou de destaque.

Aqui está o meu estilo base:

<style name="MaterialNavyTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/apptheme_color</item>
    <item name="colorPrimaryDark">@color/apptheme_color_dark</item>
    <item name="colorAccent">@color/apptheme_color</item>
    <item name="android:textColorPrimary">@color/action_bar_gray</item>
</style>

Com base no meu entendimento, o texto do botão de diálogos também deve usar essas cores. Estou errado no meu entendimento ou há algo mais que preciso fazer?


Solução:

A resposta marcada me colocou no caminho certo.

<style name="MaterialNavyTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/apptheme_color</item>
    <item name="colorPrimaryDark">@color/apptheme_color_dark</item>
    <item name="colorAccent">@color/apptheme_color</item>
    <item name="android:actionModeBackground">@color/apptheme_color_dark</item>
    <item name="android:textColorPrimary">@color/action_bar_gray</item>
    <item name="sdlDialogStyle">@style/DialogStyleLight</item>
    <item name="android:seekBarStyle">@style/SeekBarNavyTheme</item>
</style>

<style name="StyledDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="colorPrimary">@color/apptheme_color</item>
    <item name="colorPrimaryDark">@color/apptheme_color_dark</item>
    <item name="colorAccent">@color/apptheme_color</item>
</style>
Mateus
fonte
Você pode experimentar esta biblioteca que eu criei
desenvolvedor Android
15
A parte inferior deve ser a solução? Nesse caso, publique-o como resposta automática , não edite a resposta na pergunta.
Adi Inbar

Respostas:

463

ATUALIZADO EM ago 2019 COM Os componentes do material para a biblioteca android:

Com os novos componentes de material para a biblioteca do Android, você pode usar a nova com.google.android.material.dialog.MaterialAlertDialogBuilderclasse, que se estende da androidx.appcompat.AlertDialog.Builderclasse existente e fornece suporte para as especificações mais recentes de design de material.

Basta usar algo como isto:

new MaterialAlertDialogBuilder(context)
            .setTitle("Dialog")
            .setMessage("Lorem ipsum dolor ....")
            .setPositiveButton("Ok", /* listener = */ null)
            .setNegativeButton("Cancel", /* listener = */ null)
            .show();

Você pode personalizar as cores estendendo o ThemeOverlay.MaterialComponents.MaterialAlertDialogestilo:

  <style name="CustomMaterialDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
     <!-- Background Color-->
     <item name="android:background">#006db3</item>
     <!-- Text Color for title and message -->
     <item name="colorOnSurface">@color/secondaryColor</item>
     <!-- Text Color for buttons -->
     <item name="colorPrimary">@color/white</item> 
     ....
  </style>  

Para aplicar seu estilo personalizado, basta usar o construtor:

new MaterialAlertDialogBuilder(context, R.style.CustomMaterialDialog)

insira a descrição da imagem aqui

Para personalizar os botões, o título e o texto do corpo, verifique esta postagem para obter mais detalhes.

Você também pode alterar globalmente o estilo no tema do seu aplicativo:

 <!-- Base application theme. -->
 <style name="AppTheme" parent="Theme.MaterialComponents.Light">
    ...
    <item name="materialAlertDialogTheme">@style/CustomMaterialDialog</item>
 </style>

COM BIBLIOTECA DE SUPORTE e TEMA APPCOMPAT:

Com o novo, AppCompat v22.1você pode usar o novo android.support.v7.app.AlertDialog .

Basta usar um código como este:

import android.support.v7.app.AlertDialog

AlertDialog.Builder builder =
       new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle);
builder.setTitle("Dialog");
builder.setMessage("Lorem ipsum dolor ....");
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();

E use um estilo como este:

<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="colorAccent">#FFCC00</item>
        <item name="android:textColorPrimary">#FFFFFF</item>
        <item name="android:background">#5fa3d0</item>
    </style>

Caso contrário, você pode definir em seu tema atual:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- your style -->
    <item name="alertDialogTheme">@style/AppCompatAlertDialogStyle</item>
</style>

e depois no seu código:

 import android.support.v7.app.AlertDialog

    AlertDialog.Builder builder =
           new AlertDialog.Builder(this);

Aqui o AlertDialog em Kitkat: insira a descrição da imagem aqui

Gabriele Mariotti
fonte
2
Por que forçar o AlertDialog.Builder a usar o tema exato em vez de atualizar o padrão? Eu preferiria resolver esse problema no styles.xml, em vez do código Java.
Tomáš Hubálek
2
As fontes Título e Botões não estão em negrito nos dispositivos pré-pirulito.
Jimmy0251
9
Eu tive que acrescentar com "android:" para fazê-lo funcionar:<item name="android:alertDialogTheme">@style/AppCompatAlertDialogStyle</item>
1
+1 para uma resposta excelente, mas como posso obter a mesma interface do usuário para a versão Android abaixo do Lollypop ... porque com isso na interface do usuário abaixo do dispositivo parece tão estranho.
Realpranav 23/12/15
1
add importação android.support.v7.app.AlertDialog funciona
FlipNovid
9

ao inicializar o construtor de diálogo, passe o segundo parâmetro como o tema. Ele mostrará automaticamente o design do material com o nível 21 da API.

AlertDialog.Builder builder = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_DARK);

ou,

AlertDialog.Builder builder = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
Sandeep Kumar
fonte
4

AppCompat não faz isso para diálogos (ainda não pelo menos)

EDIT: faz agora. certifique-se de usarandroid.support.v7.app.AlertDialog

nadavfima
fonte
Parece que você pode fazer algumas modificações para os estilos de diálogos com AppCompat
Matthew
meu Android Studio por padrão import app.AlertDialognão me deu o appCompat. Eu tentei descobrir o que há de errado por cerca de 40 minutos antes de realmente verificar ... Maldito seja, o google!
Glorifind 28/10/2015
2

Você pode considerar este projeto: https://github.com/fengdai/AlertDialogPro

Ele pode fornecer diálogos de alerta de temas materiais quase iguais aos dos pirulitos. Compatível com Android 2.1.

Feng Dai
fonte
Apenas uma observação: essa resposta é mais antiga que a aceita.
Rekire
1

Experimente esta biblioteca:

https://github.com/avast/android-styled-dialogs

É baseado em DialogFragmentsvez de AlertDialogs(como o de @afollestad). A principal vantagem: os diálogos não são descartados após a rotação e os retornos de chamada ainda funcionam.

David Vávra
fonte
Minha biblioteca é muito mais capaz. E você sempre pode agrupar um diálogo com um DialogFragment. #
Afollestad
1

Por alguma razão, o android: textColor parece apenas atualizar a cor do título. Você pode alterar a cor do texto da mensagem usando um

SpannableString.AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.MyDialogTheme));

AlertDialog dialog = builder.create();
                Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");
                wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                dialog.setMessage(wordtoSpan);
                dialog.show();
CaptRespect
fonte
0

Diálogos de alerta de estilo de design de materiais: fonte personalizada, botão, cor e forma, ..

 MaterialAlertDialogBuilder(requireContext(),
                R.style.MyAlertDialogTheme
            )
                .setIcon(R.drawable.ic_dialogs_24px)
                .setTitle("Feedback")
                //.setView(R.layout.edit_text)
                .setMessage("Do you have any additional comments?")
                .setPositiveButton("Send") { dialog, _ ->

                    val input =
                        (dialog as AlertDialog).findViewById<TextView>(
                            android.R.id.text1
                        )
                    Toast.makeText(context, input!!.text, Toast.LENGTH_LONG).show()

                }
                .setNegativeButton("Cancel") { _, _ ->
                    Toast.makeText(requireContext(), "Clicked cancel", Toast.LENGTH_SHORT).show()
                }
                .show()

Estilo:

  <style name="MyAlertDialogTheme" parent="Theme.MaterialComponents.DayNight.Dialog.Alert">
  
        <item name="android:textAppearanceSmall">@style/MyTextAppearance</item>
        <item name="android:textAppearanceMedium">@style/MyTextAppearance</item>
        <item name="android:textAppearanceLarge">@style/MyTextAppearance</item>

        <item name="buttonBarPositiveButtonStyle">@style/Alert.Button.Positive</item>
        <item name="buttonBarNegativeButtonStyle">@style/Alert.Button.Neutral</item>
        <item name="buttonBarNeutralButtonStyle">@style/Alert.Button.Neutral</item>

        <item name="android:backgroundDimEnabled">true</item>

        <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.MyApp.Dialog.Rounded
        </item>

    </style>




    <style name="MyTextAppearance" parent="TextAppearance.AppCompat">
        <item name="android:fontFamily">@font/rosarivo</item>
    </style>


        <style name="Alert.Button.Positive" parent="Widget.MaterialComponents.Button.TextButton">
   <!--     <item name="backgroundTint">@color/colorPrimaryDark</item>-->
        <item name="backgroundTint">@android:color/transparent</item>
        <item name="rippleColor">@color/colorAccent</item>
        <item name="android:textColor">@color/colorPrimary</item>
       <!-- <item name="android:textColor">@android:color/white</item>-->
        <item name="android:textSize">14sp</item>
        <item name="android:textAllCaps">false</item>
    </style>


    <style name="Alert.Button.Neutral" parent="Widget.MaterialComponents.Button.TextButton">
        <item name="backgroundTint">@android:color/transparent</item>
        <item name="rippleColor">@color/colorAccent</item>
        <item name="android:textColor">@color/colorPrimary</item>
        <!--<item name="android:textColor">@android:color/darker_gray</item>-->
        <item name="android:textSize">14sp</item>
        <item name="android:textAllCaps">false</item>
    </style>


  <style name="ShapeAppearanceOverlay.MyApp.Dialog.Rounded" parent="">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">8dp</item>
    </style>

Resultado: insira a descrição da imagem aqui

Hari Shankar S
fonte