Android AlertDialog con esquinas redondeadas

He estado tratando de hacer mi Diálogo Alerta con esquinas redondeadas pero de alguna manera no puedo hacerlo. He intentado y he fallado. Traté de seguir este blog http://blog.stylingandroid.com/archives/271 e hizo mis estilos basados ​​en eso.

Btw, para añadir a mi pregunta ahora. Algunos de mis nuevos hallazgos. El código en el enlace anterior funciona bien en 2.3.3 (GB) pero no funciona en ICS. Algunos cambios hicieron que el código se rompiera.

Quiero evitar crear 9 imágenes de parche y por lo tanto estoy usando formas. 9 imagen del remiendo es la última cosa que intentaré. Sé que el estilo android del diálogo de la alarma está utilizando la imagen del remiendo 9. Ya lo había visto antes de lanzar esta pregunta.

/res/values/themes.xml

<?xml version="1.0" encoding="utf-8"?> <resources> <style name="MyTheme" parent="@android:style/Theme.Dialog"> <item name="android:alertDialogStyle">@style/dialog</item> </style> </resources> 

/res/values/styles.xml

 <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="AppTheme" parent="android:Theme.Light" /> <style name="myImageView"> <!-- 3dp so the background border to be visible --> <item name="android:padding">3dp</item> <item name="android:background">@drawable/image_drawable</item> <item name="android:scaleType">fitCenter</item> </style> <style name="dialog"> <item name="android:fullDark">@drawable/dialog_body</item> <item name="android:topDark">@drawable/dialog_title</item> <item name="android:centerDark">@drawable/dialog_body</item> <item name="android:bottomDark">@drawable/dialog_footer</item> <item name="android:fullBright">@drawable/dialog_body</item> <item name="android:centerBright">@drawable/dialog_body</item> <item name="android:topBright">@drawable/dialog_title</item> <item name="android:bottomBright">@drawable/dialog_footer</item> <item name="android:bottomMedium">@drawable/dialog_footer</item> <item name="android:centerMedium">@drawable/dialog_body</item> </style> </resources> 

/res/drawable/dialog_title.xml

 <inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetBottom="-1dp"> <shape android:shape="rectangle"> <solid android:color="#FFFFFF" /> <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" /> <stroke android:color="#FFFFFF" android:width="1dp" /> </shape> </inset> 

/res/drawable/dialog_body.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#FFFFFFFF" android:endColor="#FFFFFFFF" android:angle="270" /> </shape> 

/res/drawable/dialog_footer.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#FFFFFF" /> <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" /> <stroke android:width="1dp" android:color="#FFFFFF" /> </shape> 

Res / layout / dialog_layout.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="45dp" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/button1" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_marginTop="90dp" android:layout_toLeftOf="@+id/textView1" android:background="@drawable/button_selector" android:text="Ok" android:textColor="@android:color/white" android:textStyle="bold" /> <Button android:id="@+id/button2" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignTop="@+id/button1" android:layout_marginRight="48dp" android:background="@drawable/button_selector" android:text="More" android:textColor="@android:color/white" android:textStyle="bold" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/button1" android:layout_marginTop="41dp" android:orientation="vertical" > </LinearLayout> </RelativeLayout> 

Mi código para AlertDialog:

 public static void createYesNoDialog(final Context context, String positivebuttonname, String negativebuttonname, String message, int messagedrawable, String headermessage, final DialogResponse dr) { final DialogResponse dialogResponse = dr; ContextThemeWrapper ctw = new ContextThemeWrapper(context, com.gp4ever.worldlogo.quiz.R.style.MyTheme); AlertDialog.Builder builder = new AlertDialog.Builder(ctw); LayoutInflater inflater = (LayoutInflater)context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(com.gp4ever.worldlogo.quiz.R.layout.dialog_layout, null); TextView text = (TextView)layout.findViewById(com.gp4ever.worldlogo.quiz.R.id.textView1); Button buttonOk = (Button)layout.findViewById(com.gp4ever.worldlogo.quiz.R.id.button1); Button buttonMore = (Button)layout.findViewById(com.gp4ever.worldlogo.quiz.R.id.button2); text.setText(message); if (messagedrawable > 0) { text.setCompoundDrawablesWithIntrinsicBounds(messagedrawable, 0, 0, 0); } else if (messagedrawable == 0) text.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); builder.setView(layout); builder.setCancelable(false); builder.setTitle(headermessage); builder.setIcon(android.R.drawable.ic_dialog_alert); final AlertDialog dialog = builder.create(); buttonOk.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub dialog.cancel(); } }); buttonMore.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub dialog.cancel(); } }); 

}

Mi corriente de salida:

No tengo esquinas redondeadas. Puedo ver que es diferente del estilo habitual. Aunque cambie de radio en mi dibujable, las esquinas no reflejan esos cambios.

Introduzca aquí la descripción de la imagen

Puede hacerlo utilizando el siguiente código:

CustomDialog.java:

 public class MainActivity extends Activity{ private static final int ALERT_DIALOG = 1; @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setContentView( R.layout.main ); ( (Button) findViewById( R.id.button1 ) ) .setOnClickListener( new OnClickListener() { public void onClick( View v ) { showDialog( ALERT_DIALOG ); } } ); } @Override protected Dialog onCreateDialog( int id ){ Dialog dialog = null; if ( id == ALERT_DIALOG ) { ContextThemeWrapper ctw = new ContextThemeWrapper( this, R.style.MyTheme ); AlertDialog.Builder builder = new AlertDialog.Builder( ctw ); builder.setMessage( "Hello World" ) .setTitle( "Alert Dialog" ) .setIcon( android.R.drawable.ic_dialog_alert ) .setCancelable( false ) .setPositiveButton( "Close", new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, int which ) { dialog.dismiss(); } } ); dialog = builder.create(); } if ( dialog == null ) { dialog = super.onCreateDialog( id ); } return dialog; } } 

Dialog_title.xml

 <?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetBottom="-1dp"> <shape android:shape="rectangle"> <solid android:color="#000000" /> <corners android:topLeftRadius="20dp" android:topRightRadius="20dp" /> <stroke android:color="#7F7F7F" android:width="1dp" /> </shape> </inset> 

Dialog_footer.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#7F7F7F" /> <corners android:bottomLeftRadius="20dp" android:bottomRightRadius="20dp" /> <stroke android:color="#7F7F7F" android:width="1dp" /> </shape> 

Sólo cambia la cantidad de radio en:

dialog_title.xml

y

dialog_footer.xml

Y que va a generar la siguiente salida:

Introduzca aquí la descripción de la imagen

Espero que esto te ayudará.


ACTUALIZAR:
No soy un experto, pero esto es lo que he encontrado. Puede ser correcto o incorrecto. Después de muchos intentos terminé con lo siguiente:

1- ContextThemeWrapper no es aplicable para API 14, funciona bien en Gingerbread y versiones anteriores, pero con API> 10 no funciona.

2- para superar el problema anterior y hacer que funcione en API> 10 como se solicita, reemplazo esta línea:

 ContextThemeWrapper ctw = new ContextThemeWrapper( this, R.style.MyTheme ); AlertDialog.Builder builder= new AlertDialog.Builder( ctw ); 

con este:

 AlertDialog.Builder builder= new AlertDialog.Builder( this,R.style.MyTheme ); 

Pero usted necesita cambiar:

 android:minSdkVersion="8" 

a

 android:minSdkVersion="11" 

El resultado será como se muestra en la siguiente imagen en ICS (API 14):

Introduzca aquí la descripción de la imagen

Esta imagen es de una galaxia S3 de Samsung que funciona ICS.

Nota: el proyecto modificado iniciado con API 14 SO manifiesta sdk será:

 <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="15" /> 

FINAL PALABRA: Como mi poco conocimiento en el desarrollo de Android (no soy un experto),

1- El diálogo de alerta personalizada se ejecuta sin problemas en la API <10 pero no> 10 con el mismo código Java,

Si queremos que se ejecute en ICS con el mismo efecto que aparece en API <10, tenemos que modificar el código , por lo que se ejecutará en ICS, pero no se ejecutará en cualquier versión de API 11.

2- incluso el resultado en ICS no es satisfactorio, la esquina redonda se aplica sólo al título pero no al pie de página.


SEGUNDA ACTUALIZACIÓN: FINALMENTE consigo todos los rincones redondos,

SOLO aplique el padding a dialog_footer.xml siguiente manera:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#7F7F7F" /> <corners android:bottomLeftRadius="20dp" android:bottomRightRadius="20dp" /> <stroke android:color="#7F7F7F" android:width="1dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> 

Imagen de salida:

Introduzca aquí la descripción de la imagen

Esta imagen es de una galaxia S3 de Samsung que funciona ICS.

Sólo un paso más de la respuesta de @iDroid Explorer

Agregue esta línea cuando cree el diálogo

 dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 

Y esto obtendrá el rectángulo desaparecer (que en realidad es transparente) y obtener un perfecto cuadro de diálogo redondeado.

Tengo intentar el mismo problema con abajo uno y trabaja para mí. Incluso para ICS también.

1. Primero he puesto el tema a mi AlertDialog.

 final Dialog nag = new Dialog(this,android.R.style.Theme_Translucent_NoTitleBar_Fullscreen); nag.requestWindowFeature(Window.FEATURE_NO_TITLE); nag.setCancelable(true); nag.setContentView(R.layout.pop_exit); Button btnNO = (Button)nag.findViewById(R.id.btn_popup_NO); Button btnYES = (Button)nag.findViewById(R.id.btn_popup_YES); btnNO.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { nag.cancel(); } }); btnYES.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.exit(0); } }); nag.show(); 

2. Luego han implementado el diseño personalizado para la vista de diálogo

Pop_exit.xml

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:gravity="center" android:layout_height="fill_parent"> <!-- <LinearLayout android:orientation="vertical" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:background="#95000056" android:layout_width="fill_parent" android:layout_height="wrap_content"> --> <LinearLayout android:orientation="vertical" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:background="@drawable/round" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:text="Exit Application" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textStyle="bold" android:textColor="#fff" android:textSize="20dp" android:layout_marginTop="5dp" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="5dp" android:weightSum="2" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:gravity="center"> <Button android:text="No" android:layout_weight="1" android:gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn_popup_NO" /> <Button android:text="Ok" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn_popup_YES" /> </LinearLayout> </LinearLayout> </LinearLayout> 

3. Añada ahora la forma al fondo de la disposición principal de pop_exit.xml

Round.xml // archivo de forma

  <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#99000056" /> <corners android:radius="35px" /> <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" /> </shape> 

Sólo lo hago. Funcionará para usted también para ICS .

Espero que te ayude. Si no, entonces hágamelo saber.

Disfrute de la codificación …

🙂

Cuando diga que no quiere usar una imagen de 9 parches, eche un vistazo aquí.

https://stackoverflow.com/a/1683195/940834

El principio es exactamente el mismo, excepto que asigna el fondo a su diseño donde este ejemplo es a un diseño lineal.

  1. Crear xml en la carpeta dibujable con dialog_corner.

     <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/main_background"/> <corners android:topLeftRadius="@dimen/margin_10" android:topRightRadius="@dimen/margin_10" android:bottomRightRadius="@dimen/margin_10" android:bottomLeftRadius="@dimen/margin_10" /> </shape> 

    2. poner en el diseño

    Android: background = "@ drawable / dialog_corner"

    3.en usted el archivo de java guarda debajo del código

Ver mView = LayoutInflater.from (mContext) .inflate (R.layout.layout_pob, null); AlertDialog.getWindow (). SetBackgroundDrawable (nuevo ColorDrawable (Color.TRANSPARENT));

  • Los atributos de estilo no funcionan en las etiquetas de combinación
  • Atributos personalizados en styles.xml
  • Problemas de renderizado después de las dependencias gradle actualizadas
  • Estilo de búsqueda de Android
  • Derecho Drawable en Android. No funciona
  • Quitar el rectángulo de color de fondo adicional del menú de desbordamiento entre / salir de las animaciones?
  • Texto de sugerencia no capaz de ver en Android versión 2.3 pero funciona en 4.1
  • En Android XML, ¿puedo establecer buttonStyleSmall o Button.Small como un estilo padre para un estilo personalizado?
  • Programaticamente obtener color del recurso utilizando ContextCompat que no ignora el calificador nocturno
  • Android Marshmallow - Barra de progreso de búsqueda personalizada que no se muestra
  • ¿Qué propiedad controla el fondo desplegable de Spinner?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.