Custom FragmentDialog con esquinas redondas y no 100% de ancho de pantalla
Estoy creando un diálogo de fragmento personalizado con esquinas redondas y con un diseño que no llenaría el ancho de la pantalla (prefiero que sólo envuelve su contenido).
Este es mi rounded_dialog.xml
en la carpeta rounded_dialog.xml
, que es llamada por mi Custom ThemeWithCorners
como fondo para el diálogo. También traté de configurarlo como fondo para el diseño lineal que crea su contenido, pero nada funciona.
- Problema de devolución de llamada de diálogo a pantalla completa de Android
- La clase interna del fragmento debe ser estática
- Cómo DialogFragment afecta el ciclo de vida de la actividad de llamada
- Texto oscuro sobre fondo oscuro en AlertDialog con Theme.Sherlock.Light
- Acción ActionBar en DialogFragment
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="@android:color/white"/> <corners android:radius="20dp" /> </shape>
Y así es como llamo al diálogo:
final String FTAG = "TAG_FRAGMENT_DIALOG_CALENDAR"; dialog = (CalendarDialog) fm.findFragmentByTag(FTAG); ft = fm.beginTransaction(); if (dialog != null) { ft.remove(dialog); } dialog = CalendarDialog.newInstance(this); dialog.setCancelable(true); ft.add(dialog, FTAG); ft.show(dialog); ft.commit();
En el método onCreate del diálogo establezco el estilo y el tema:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, R.style.ThemeWithCorners); }
Este es el método onCreateView:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getDialog().setCanceledOnTouchOutside(true); v = (MyCalendar)inflater.inflate(R.layout.calendar_dialog, container, true) return v; }
También traté de añadir esto al método onCreateDialog como otras respuestas en SO sugerido pero tampoco funcionó:
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog d = super.onCreateDialog(savedInstanceState); LayoutParams lp=d.getWindow().getAttributes(); d.getWindow().setBackgroundDrawable(new ColorDrawable(0)); lp.width=-2;lp.height=-2;lp.gravity=Gravity.CENTER; lp.dimAmount=0; lp.flags=LayoutParams.FLAG_LAYOUT_NO_LIMITS | LayoutParams.FLAG_NOT_TOUCH_MODAL; return d; }
Así que para resumir, quiero esquinas redondas, no el ancho del 100% de la pantalla, que preferiblemente debe envolver su contenido. Por favor, por favor, necesito ayuda, estoy realmente desesperada por esto, ¡he estado intentándolo durante días!
- ¿Cómo afecta DialogFragment al ciclo de vida del Fragmento llamante?
- El fragmento Android Dialog elimina los bordes negros (arriba y abajo)
- Android: videoview in dialogfragment
- ¿Por qué Android O falla con "no pertenece a este FragmentManager!"
- DialogFragment lanza ClassCastException si se llama desde Fragment
- Cómo hacer que este fragmento de diálogo simple semi-transparente
- DialogFragment - Obtener el ancho del diálogo
- Cómo puedo establecer un intervalo de minutos en DialogFragment
Bueno, acabo de encontrar una solución, pero no estoy muy contento con eso.
Puse el fondo (rounded_dialog.xml) para el diálogo como esto:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@android:color/transparent"/> <corners android:radius="10dp" /> <padding android:left="10dp" android:right="10dp"/> </shape>
Entonces fijé esto a mi diálogo en su método del'onCreateView 'esta manera abajo. Las esquinas redondeadas no son realmente necesarias en este pedazo de código, ya que el fondo es transparente, pero el relleno es importante, porque el diálogo sigue siendo de hecho tan amplio como la pantalla, pero el relleno hace que parezca que no lo es.
getDialog().getWindow().setBackgroundDrawableResource(R.drawable.rounded_dialog);
Y, al final, establezco el fondo de los componentes del diálogo a otro dibujable a medida que hace que las esquinas giren. Tengo un LinearLayout con RelativeLayout en la parte superior y TextView en la parte inferior, por lo que establezco @null a los padres LinearLayout y establecer dos diferentes drawables personalizados a las dos partes, una de las cuales ha redondeado bottomCorners y el otro topCorners.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:background="@drawable/title_round" > <RelativeLayout android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@drawable/blue_title_round_top" android:paddingTop="4dp" android:paddingBottom="4dp" > <TextView android:id="@+id/calendarHint" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/rounded_bottom" android:layout_gravity="center" android:gravity="center" /> </LinearLayout>
Creo que hay una solución más adecuada a esto, ya que esto es correcto sólo visualmente, no funcionalmente, pero lo suficientemente correcto para este caso.
Fondo de diálogo: dialog_rounded_bg.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@android:color/white" /> <corners android:radius="12dp" /> </shape>
Diseño del dialog_rounded.xml
diálogo: dialog_rounded.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:background="@drawable/dialog_rounded_bg" android:minWidth="260dp" android:orientation="vertical" android:padding="24dp"> ... </LinearLayout>
Fragmento de diálogo: RoundedDialog.java
public class RoundedDialog extends DialogFragment { ... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.dialog_rounded, container, false); // Set background transparent getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); return view; } ... }
- Imprimir el símbolo de copyright en TextView
- JQuery móvil deshabilitar el contenido de la página desplazamiento vertical