2011-09-01 37 views
18

Tengo una actividad principal donde los usuarios pueden cambiar (a través de preferencias) el color de fondo a su color favorito. Mi problema es que no puedo cambiar el color de fondo de ningún cuadro de diálogo personalizado.¿Cómo cambiar el color de fondo del diálogo mediante programación?

Otras respuestas en desbordamiento de pila sugieren:

(a) overiding the default theme para el color preferido. No creo que sea una solución adecuada en este caso, ya que sé que cambiar los temas en tiempo de ejecución no es recomendable.

(b) Changing in styles.xml (no es adecuado en este caso, ya que no puedo cambiar en tiempo de ejecución)

(c) Overriding the AlertBuilder class (pero esto tintes todo el diálogo de alerta)

Esta más cerca que han llegado cambiar el color es eliminar el título del generador de alertas y establecer el fondo de la vista personalizada en el color favorito (por ejemplo, color rosa). Desafortunadamente, esto da una tira fea en la parte superior e inferior del cuadro de diálogo.

El código se incluye después de la imagen, las sugerencias sobre cómo cambiar el fondo del diálogo serían muy apreciadas.

Dialog appearance

Código de la apariencia predeterminada

protected Dialog onCreateDialog(int dialogId) { 
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final AlertDialog.Builder builder = new AlertDialog.Builder(this); 


     final View viewMessEdit = inflater.inflate(R.layout.example,(ViewGroup) findViewById(R.id.dialog_mess_edit_root)); 
       builder.setView(viewMessEdit); 
     builder.setTitle("Alert builder's title"); 
} 

Código para cambiar el color de diálogo personalizado vistas de fondo (y el título del constructor de alerta se retira)

protected Dialog onCreateDialog(int dialogId) { 
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final AlertDialog.Builder builder = new AlertDialog.Builder(this); 


     final View viewMessEdit = inflater.inflate(R.layout.example,(ViewGroup) findViewById(R.id.dialog_mess_edit_root)); 
       builder.setView(viewMessEdit); 
       viewMessEdit.setBackgroundResource(R.color.pink_dark); 

} 
+0

¿Puedes terminar este diálogo como tu foto? Si es así, ¿puedes compartir? – pengwang

Respuesta

8

Me enfrenté al mismo problema. Y la única forma de resolverlo era ampliar mi propia versión del diseño. Veo que en tu caso es un AlertDialog. Lo que te recomiendo que hagas es crear una clase única, es decir, tu AlertDialog personalizado y crear un diseño para esto, y luego inflarlo.

Aquí hay una publicación que me ayudó mucho. http://blog.androgames.net/10/custom-android-dialog/

Seguí esta publicación y resolví mi problema con la personalización de los cuadros de diálogo.

Por favor, si tiene más dudas, hágamelo saber.

Gracias.

+1

Gracias por ese enlace a la publicación de androgames. Estaba claramente escrito y bien comentado. Aquí hay una publicación de blog relacionada. http://dtmilano.blogspot.com/2010/01/android-ui-colored-dialogs.html – Mel

+15

@rogcg link not working. – Deepak

+0

He actualizado el enlace a una versión en caché utilizando WayBack Machine. – kabuko

17

¡Encontré una solución de una sola regla!

d.getWindow().setBackgroundDrawableResource(R.drawable.menubackground); 

funciona para mí con un cuadro de diálogo normal. No sé si funciona en AlertDialog

+2

Lo probé, pero no es así. Intenté con un color sólido y apareció mi color en lugar de la sombra del diálogo de alerta en el fondo. – soger

+0

@ user3696814 Bueno, funciona en AlertDialog. – CopsOnRoad

3

He encontrado un hack, sin crear un diseño personalizado, puedes crear varios diseños jugando con algunas propiedades de AlertDialog.

Lo que tienes que hacer:

Cuando AlertDialog es visible en su pantalla, OnShowListener se llama. Entonces, al agregar dialog.setOnShowListener(this), podrá personalizar su AlertDialog.

Código:

// Create AlertDialog 
AlertDialog.Builder adb = new AlertDialog.Builder(context1); 
    adb.setTitle(context1.getString(R.string.app_name)) 
    .setMessage(message) 
    .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

     } 
}); 
AlertDialog dialog = adb.create(); 

// Make some UI changes for AlertDialog 
dialog.setOnShowListener(new DialogInterface.OnShowListener() { 
    @Override 
    public void onShow(final DialogInterface dialog) { 

     // Add or create your own background drawable for AlertDialog window 
     Window view = ((AlertDialog)dialog).getWindow(); 
     view.setBackgroundDrawableResource(R.drawable.your_drawable); 

     // Customize POSITIVE, NEGATIVE and NEUTRAL buttons. 
     Button positiveButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_POSITIVE); 
     positiveButton.setTextColor(context1.getResources().getColor(R.color.primaryColor)); 
     positiveButton.setTypeface(Typeface.DEFAULT_BOLD); 
     positiveButton.invalidate(); 

     Button negativeButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEGATIVE); 
     negativeButton.setTextColor(context1.getResources().getColor(R.color.primaryColor)); 
     negativeButton.setTypeface(Typeface.DEFAULT_BOLD); 
     negativeButton.invalidate(); 

     Button neutralButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEUTRAL); 
     neutralButton.setTextColor(context1.getResources().getColor(R.color.primaryColor)); 
     neutralButton.setTypeface(Typeface.DEFAULT_BOLD); 
     neutralButton.invalidate(); 
    } 
}); 
+0

como un amuleto) thx –

1

La solución sugerida

d.getWindow().setBackgroundDrawableResource(R.drawable.menubackground); 

no funcionan bien (probado en 6.0), ya que cambia la sombra de diálogo

Aquí está mi solución:

public static void changeDialogBackground(final Dialog dialog,final int resId) { 
    dialog.getWindow().getDecorView().setBackgroundResource(resId); 
    dialog.setOnShowListener(new DialogInterface.OnShowListener() { 
     @Override 
     public void onShow(final DialogInterface dialog) { 
      Window window = ((AlertDialog)dialog).getWindow(); 
      window.getDecorView().setBackgroundResource(resId); 
     } 
    }); 
} 
3

color de fondo Diálogo

dialog.getWindow().setBackgroundDrawableResource(R.color.glassblack); 

realmente funcionó muy bien para mí.

Cuestiones relacionadas