Android: AlertDialog con vista personalizada y esquinas redondeadas

Estoy tratando de construir un AlertDialog con una view personalizada (sin título o pie de página) y esquinas redondeadas. He visto un montón de mensajes sobre cómo hacer eso y he intentado un montón de cosas, pero no puedo construir como quiero.

Este es mi objetivo:

Introduzca aquí la descripción de la imagen

He creado un drawable para el dialog llamado dialog_background.xml:

 <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#FFAAAAAA" /> <stroke android:width="2dp" android:color="#FF000000" /> <corners android:radius="20dp" /> </shape> 

Y agregué un style para usarlo:

 <style name="MyDialog" parent="@android:style/Theme.Dialog"> <item name="android:background">@drawable/dialog_background</item> </style> 

El layout de mi view personalizada va a tener dos botones. En este momento te muestro un LinearLayout vacío para que sea sencillo. Esto es playdialog.xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" style="@style/MyDialog" > </LinearLayout> 

Para crear el DialogFragment Dialog utilizo un DialogFragment . Esta es su función onCreateDialog :

 public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); builder.setView(inflater.inflate(R.layout.playdialog, null)); return builder.create(); } 

Ok, si utilizo el código así me sale esto:

Introduzca aquí la descripción de la imagen

Intenté fijar el fondo del dialog para modificar transparente mi código de DialogFragment :

 public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); builder.setView(inflater.inflate(R.layout.playdialog, null)); **NEW** Dialog d = builder.create(); d.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); return d; } 

El resultado es exactamente el mismo, así que me di cuenta de que ese rectángulo blanco en mi dialog es desde mi view personalizada, no desde el dialog . Ya estoy configurando el fondo de mi view para dialog_background.xml, por lo que no puedo configurarlo también transparente o pierdo las esquinas, el color, etc.

Entonces decidí modificar el fondo del dialog usando dialog_background.xml y tengo mi opinión tener un color sólido como fondo.

En mi diseño de view personalizada (playdialog.xml) he sustituido style = "@ style / MyDialog" por:

 android:background="#FFAAAAAA" 

Y entonces en mi DialogFragment utilicé este código:

 public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); builder.setView(inflater.inflate(R.layout.playdialog, null)); **NEW** Dialog d = builder.create(); d.getWindow().setBackgroundDrawableResource(R.drawable.dialog_background); return d; } 

Esto es lo que obtengo:

Introduzca aquí la descripción de la imagen

Es casi lo que quería, pero puede ver mis bordes de view personalizada, por lo que no es lo suficientemente bueno. En este punto no sabía qué más podía hacer.

¿Alguien sabe cómo puedo solucionarlo?

¡Gracias!

Acabo de crear un cuadro de diálogo de alerta personalizada. Pero sus esquinas no son redondeadas.

Primero crear un diseño para él como –

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="240sp" android:layout_height="wrap_content" android:background="#FFFFFF" tools:ignore="SelectableText" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="1sp" tools:ignore="UselessParent" > <TableLayout android:id="@+id/tablelayout_dialog_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:stretchColumns="1" > <TableRow android:id="@+id/tablerow_dialog_title" android:layout_width="fill_parent" android:layout_height="wrap_content" tools:ignore="UselessParent" > <ImageView android:id="@+id/imageview_dialog_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/alertwhite" android:layout_gravity="center" android:background="#643c3a" android:contentDescription="@string/string_todo"/> <TextView android:id="@+id/textview_dialog_title" android:layout_width="wrap_content" android:layout_height="fill_parent" android:background="#643c3a" android:padding="10sp" android:gravity="center_vertical" android:textColor="#FFFFFF" android:textSize="15sp" /> </TableRow> </TableLayout> <View android:id="@+id/viewline_dialog" android:layout_below="@+id/tablelayout_dialog_title" android:layout_width = "wrap_content" android:layout_height="0.25dip" android:background="#ffffff" android:layout_centerVertical ="true" /> <TextView android:id="@+id/textview_dialog_text" android:layout_below="@+id/viewline_dialog" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="8sp" android:background="#643c3a" android:textColor="#FFFFFF" android:textSize="12sp" /> <View android:id="@+id/viewline1_dialog" android:layout_width = "wrap_content" android:layout_height="0.5dip" android:background="#ffffff" android:layout_centerVertical ="true" android:layout_below="@+id/textview_dialog_text"/> <TableLayout android:id="@+id/tablelayout_dialog_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:stretchColumns="*" android:layout_below="@+id/viewline1_dialog" android:background="#a8a8a8" > <TableRow android:id="@+id/tablerow_dialog_button" android:layout_width="fill_parent" android:layout_height="wrap_content" tools:ignore="UselessParent" > <Button android:id="@+id/button_dialog_yes" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="8sp" android:paddingTop="5sp" android:paddingBottom="5sp" android:background="@drawable/roundedcornerbuttonfordialog_shape" android:text="@string/string_yes" /> <Button android:id="@+id/button_dialog_no" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="8sp" android:paddingTop="5sp" android:paddingBottom="5sp" android:background="@drawable/roundedcornerbuttonfordialog_shape" android:text="@string/string_no" /> </TableRow> </TableLayout> </RelativeLayout> 

Ahora escriba el código de diálogo como –

 public static void callAlert(String message, final Context context){ final Dialog dialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.customdialog_layout); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE)); TextView tvTitle = (TextView) dialog.findViewById(R.id.textview_dialog_title); tvTitle.setText("MyApp.."); TextView tvText = (TextView) dialog.findViewById(R.id.textview_dialog_text); tvText.setText(message); Button buttonDialogYes = (Button) dialog.findViewById(R.id.button_dialog_yes); buttonDialogYes.setOnClickListener(new OnClickListener() { public void onClick(View v) { // Do your stuff... dialog.dismiss(); } }); Button buttonDialogNo = (Button) dialog.findViewById(R.id.button_dialog_no); buttonDialogNo.setOnClickListener(new OnClickListener() { public void onClick(View v) { // Do your stuff... dialog.dismiss(); } }); dialog.show(); } 

Y llamar a este método como –

 String message = "Your Message"; callAlert(message, callingClass.this); 

Espero que esto te ayudará.

En mi caso, para eliminar las fronteras en el diálogo de esta solución fue útil:

 dialog.setStyle(DialogFragment.STYLE_NO_FRAME, 0); 

Como se describe aquí https://stackoverflow.com/a/19521674/3173384

El código abajo resolvió el problema

 MyDialog mydialog = new MyDialog(this, "for testing", new myOnClickListener() { @Override public void onPositiveButtonClick() { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "I am positive button in the dialog", Toast.LENGTH_LONG).show(); } @Override public void onNegativeButtonClick() { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "I am negative button in the dialog", Toast.LENGTH_LONG).show(); } }); // this will remove rectangle frame around the Dialog mydialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); mydialog.show(); 

Gracias, Nagendra

¿Por qué no utiliza la imagen que está mostrando como "Este es mi objetivo:" guardar su imagen bg objetivo en la carpeta dibujable.

 private AlertDialog createAlertDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setView(getLayoutInflater().inflate(R.layout.playdialog, null)); return builder.create(); } 

entonces

 AlertDialog dialog = createAlertDialog(); dialog.show(); 
  • Android - Actualizar datos en un AlertDialog?
  • AlertDialog setOnDismissListener no funciona
  • Cómo establecer la posición de un AlertDialog de la pantalla en la parte superior en Android?
  • Incorporar RatingBar en AlertDialog
  • Cómo establecer la validación nulo en el cuadro de diálogo edittextpreference
  • Cómo agregar más de una columna cuando se utiliza el método setCursor del constructor de alertdialog para mostrar una lista de elementos de una base de datos?
  • ¿Cómo puedo obtener los resultados de un AlertDialog?
  • Estilo de botón en AlertDialogs
  • Cómo recuperar el valor de EditText en AlertDialog?
  • AlertDialog para envolver su contenido
  • Cómo deshabilitar algunos elementos en listview que se encuentra en el cuadro de diálogo Alert
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.