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:
- ¿Qué significa resid> = 0x0100000 en la fuente AlertDialog?
- ¿Es posible crear una lista expandible AlertDialog?
- ¿Cómo se muestra un diálogo en android sin un contexto de actividad?
- ¿Cómo probar un AlertDialog en Android?
- Cómo alinear el centro de diálogo personalizado en android?
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:
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:
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!
- La placa de teclado mueve toda la disposición hacia arriba
- AlertDialog en una función que tiene un valor de retorno
- Objetos personalizados en la lista AlertDialog; Cómo obtener una cadena de pantalla y luego el valor real?
- ¿Cómo se muestra un diálogo de alerta sólo en la primera ejecución de mi aplicación?
- mostrar texto en diálogo de alerta
- Cómo configurar parte del texto en negrita cuando se utiliza AlertDialog.setMessage () en Android?
- Android: AlertDialog - Usuario haga clic en otro lugar
- Caja de AlertDialog de Android WindowManager $ Problema de BadTokenException
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();
- Emita el desplazamiento WebView en NestedScrollView Android 2.3 o menos
- Subir archivo a Amazon S3 desde Android lento