FragmentDialog personalizado con esquinas redondeadas y sin ancho de pantalla del 100 %
⏰ 10 minutos de lectura
vandus
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 solo envolviera su contenido).
este es mi rounded_dialog.xml en la carpeta dibujable, 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.
Entonces, para resumir, quiero esquinas redondeadas, no el 100% del ancho de la pantalla, preferiblemente debería envolver su contenido. Por favor, necesito ayuda, estoy realmente desesperada por esto, ¡lo he estado intentando durante días!
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;
}
...
}
Actualizar: Si no pones la bandera Window.FEATURE_NO_TITLEaparece una línea azul en la parte superior del cuadro de diálogo en dispositivos con Android ≤ 4.4.
¿Qué fuente has usado en el diálogo?
– Anónimo
29 de enero de 2018 a las 20:41
Es una fuente personalizada (Maison Neue).
–David Miguel
30 de enero de 2018 a las 14:07
Esta solución también funcionó con ConstraintLayout en lugar de un LinearLayout.
– Michael Osofsky
11 de junio de 2019 a las 16:26
vandus
Bueno, acabo de encontrar una solución, aunque no estoy muy contento con ella.
Configuré el fondo (rounded_dialog.xml) para el cuadro de diálogo de esta manera:
Luego configuré esto en mi diálogo en su método ‘onCreateView’ 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.
Y al final configuré el fondo de los componentes del cuadro de diálogo en otro dibujo personalizado que hace que las esquinas se redondeen. Tengo un LinearLayout con RelativeLayout en la parte superior y TextView en la parte inferior, así que establecí @null en el LinearLayout principal y configuré dos dibujables personalizados diferentes para las dos partes, una de las cuales tiene esquinas inferiores redondeadas y la otra esquinas superiores.
Creo que hay una solución más adecuada para esto, ya que es correcta solo visualmente, no funcionalmente, pero lo suficientemente correcta para este caso.
Alon Deslizador
Respuesta actualizada de 2022 con Kotlin y View Binding –
class InternetLostDialog : DialogFragment() {
private lateinit var binding: DialogInternetLostBinding
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
binding = DialogInternetLostBinding.inflate(LayoutInflater.from(context))
val builder = AlertDialog.Builder(requireActivity())
isCancelable = false
builder.setView(binding.root)
binding.root.setOnClickListener {
requireActivity().finish()
}
val dialog = builder.create()
dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
return dialog
}
}
De otra manera:
Usar setStyle() en onCreate() método para aplicar un estilo para usted DialogFragment. Entonces, puedes usar android:background igual que siempre en el vista raíz de your_layout.xml expediente.
Pasos:
estilo.xml presentar en resolución carpeta):
<style name="DialogTheme_transparent" parent="Theme.AppCompat.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<!--You can set other style items also, such as animations and etc-->
</style>
Crear your_layout.xml archivo en el carpeta de diseño:
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información