android - custom - FragmentDialog personalizado con esquinas redondas y no 100% de ancho de pantalla
custom dialog android (2)
Estoy creando un cuadro de diálogo de fragmento personalizado con esquinas redondeadas y con un diseño que no llenaría el ancho de la pantalla (preferiría si simplemente envolviera su contenido).
este es mi rounded_dialog.xml
en la carpeta rounded_dialog.xml
, que se llama por mi Custom ThemeWithCorners
como fondo para el diálogo. También intenté establecerlo como fondo para el diseño lineal que crea su contenido, pero nada funciona.
<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 intenté agregar esto al método onCreateDialog ya que otras respuestas en SO sugirieron 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 redondeadas, no ancho del 100% de la pantalla, preferiblemente debería envolver su contenido. Por favor, por favor, necesito ayuda, estoy muy desesperado por esto, ¡lo he estado intentando durante días!
Bueno, acabo de encontrar una solución, pero no estoy realmente contento con ella.
Establecí el fondo (rounded_dialog.xml) para el diálogo como este:
<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>
Luego puse esto en mi cuadro de diálogo en su método "no creado" de esta manera a continuación. Las esquinas redondeadas no son realmente necesarias en este fragmento de código, ya que el fondo es transparente, pero el relleno es importante, porque el diálogo sigue siendo tan ancho como la pantalla, pero el relleno hace que parezca que no lo es.
getDialog().getWindow().setBackgroundDrawableResource(R.drawable.rounded_dialog);
Y al final, puse el fondo de los componentes del diálogo en otro dibujo personalizable que redondea las esquinas. Tengo un LinearLayout con RelativeLayout en la parte superior y TextView en la parte inferior, así que establezco @null en el LinearLayout principal y establezco dos elementos dibujables personalizados diferentes en las dos partes, una de las cuales ha redondeado las esquinas inferiores y la otra superior.
<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 solo visualmente, no realmente funcional, pero es lo suficientemente correcto para este caso.
Fondo del 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 de 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 transparent background and no title
if (getDialog() != null && getDialog().getWindow() != null) {
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
}
return view;
}
...
}
Actualización: si no configura la bandera Window.FEATURE_NO_TITLE
, aparece una línea azul en la parte superior del cuadro de diálogo en dispositivos con Android ≤ 4.4.