Android AlertDialog with rounded corners

55,065

Solution 1

You can do it using the following code:

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>

Just change the radius amount in:

dialog_title.xml

and

dialog_footer.xml

and that'll generate the following output:

enter image description here

hope this will help you.


UPDATE:
I'm not an expert but this is what I found. It may be right or wrong. After many attempts I ended up with the following:

1- ContextThemeWrapper is not applicable for API 14, it works fine on Gingerbread and older versions but with API > 10 it doesn't work.

2- to overcome the above issue and make it work on API > 10 as requested, I replace this line:

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

with this:

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

but you need to change:

android:minSdkVersion="8"  

to

android:minSdkVersion="11" 

the result will be as shown in the following image on ICS (API 14):

enter image description here

This image is from a Samsung Galaxy S3 running ICS.

Note: modified project initiated with API 14 SO manifest sdk will be:

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

FINAL WORD: As my little knowledge in Android development (I'm not an expert),

1- custom alert dialog runs smoothly in API < 10 but not > 10 with the same Java code,

if we want it to run in ICS with the same effect as appeared in API < 10, we need to modify the code, so it will run on ICS but will not run in any version down API 11.

2- even the result in ICS is not satisfactory, the round corner applies only to the title but not the footer.


SECOND UPDATE: FINALLY I get all corners round,

JUST apply padding to dialog_footer.xml as follows:

<?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>

Output image:

enter image description here

This image is from a Samsung Galaxy S3 running ICS.

Solution 2

Just one more step from @iDroid Explorer answer

add this line when you build the dialog

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

and this will get the rectangle disappear (which actually is transparent) and get a perfect rounded dialog box.

Solution 3

Just use the MaterialAlertDialogBuilder included in the official Material Components library.

new MaterialAlertDialogBuilder(MainActivity.this,R.style.MyThemeOverlay_MaterialComponents_MaterialAlertDialog)
            .setTitle("Dialog")
            .setMessage("Lorem ipsum dolor ....")
            .setPositiveButton("Ok", /* listener = */ null)
            .setNegativeButton("Cancel", /* listener = */ null)
            .show();

Then define the style using the shapeAppearanceOverlay attribute.

 <style name="MyThemeOverlay.MaterialComponents.MaterialAlertDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.MyApp.Dialog.Rounded</item>
  </style>

  <style name="ShapeAppearanceOverlay.MyApp.Dialog.Rounded" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">8dp</item>
  </style>

enter image description here

Solution 4

I have try the same problem with below one and it works for me. Even for ICS also.

1. First i have put the theme to my 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. Then have implemented the Custom Layout for the Dialog view

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. Now add shape to the Background of parent layout of pop_exit.xml

round.xml // shape file

    <?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>

I just do it. It will works for you also for ICS.

Hope it will help you. If not then let me know.

Enjoy Coding...

:)

Solution 5

As you state you dont want to use a 9 patch image, take a look here.

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

The principle is exactly the same, except you assign the background to your layout where this example is to a linear layout.

Share:
55,065
VendettaDroid
Author by

VendettaDroid

I am an Android Developer and I am here to give back to community.

Updated on July 23, 2022

Comments

  • VendettaDroid
    VendettaDroid almost 2 years

    I have been trying to make my Alert Dialog with rounded corners but somehow I am not able to. I have tried and I failed. I tried to follow this blog http://blog.stylingandroid.com/archives/271 and made my styles based on that.

    Btw, to add to my question now. Some of my new finding. The code in the above link just works fine on 2.3.3 (GB) but does not work at all in ICS . Some change made the code to break.

    I want to avoid creating 9 patch images and thus I am using shapes. 9 patch image is the last thing that I will try.I know that android alert dialog style is using 9 patch image. I already looked that up before throwing this question.

    /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>
    

    My code for 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();
                }
            });
    

    }

    My current output:

    I do not get any rounded corners. I can see that it is different from the usual style. Even though I change radius on my drawable, the corners does not reflect to those changes.

    enter image description here

  • VendettaDroid
    VendettaDroid almost 12 years
    I did try to do that but then I have my Dialog layout which has rounded corners and then the outer rectangle which is a part of the dialog theme by default in android. So think of a rounded layout inside of rectangle, that is what I get.
  • IAmGroot
    IAmGroot almost 12 years
    Drop the alert dialog for a custom one maybe.
  • VendettaDroid
    VendettaDroid almost 12 years
    That is not the problem. I know I can do this easily if I go for dialog activity and other options. But I want to make sure that I can change the AlertDialog style the way I want.
  • VendettaDroid
    VendettaDroid almost 12 years
    I know I can do this with dialog, I would like to do it with AlertDialog though. I am trying to create alertdialog with my theme. I do not want any other customization. I just want rounded corners. If you look at the blog link that I have posted, that code did work some day but now it is not working. I don't know what is wrong with it now.
  • androidqq6
    androidqq6 almost 12 years
    @VendettaDroid i tried the sample code from above link and run it on my mobile , its already rounded corner .
  • androidqq6
    androidqq6 almost 12 years
    @VendettaDroid i applied your theme i get it round too
  • VendettaDroid
    VendettaDroid almost 12 years
    Can you try to change the roundness and see if it is getting changed. I don't see that changing at all.
  • VendettaDroid
    VendettaDroid almost 12 years
    I already know that I need to change the radius the in my drawable shapes in order to get more roundedness. I already tried changing those radius. It didn't work for me.
  • VendettaDroid
    VendettaDroid almost 12 years
    Btw, to add to my question now. Some of my new finding. The code in the link just works fine on 2.3.3 (GB) but does not work at all in ICS . Some change made the code to break.
  • VendettaDroid
    VendettaDroid almost 12 years
    I am trying exactly the same code as given from link and just changed radius to 15dp. The code works well if I run on 2.3.3 (GB) device but does not work on ICS. Did you try to run the code on ICS?
  • androidqq6
    androidqq6 almost 12 years
    @VendettaDroid im out side now when reach home i will run it on ICS devise and replay you
  • VendettaDroid
    VendettaDroid almost 12 years
    No issues. Thanks for your time.
  • androidqq6
    androidqq6 almost 12 years
    @VendettaDroid i test it on ICS device , its not only did not show the round corner but also did not apply the whole theme , im working on that issue , any finding i will tell you
  • VendettaDroid
    VendettaDroid almost 12 years
    Yes, I am aware that it did not apply the whole theme. Thanks, I am working on that too. Let's see whats wrong.
  • VendettaDroid
    VendettaDroid over 11 years
    Thanks for taking time to answer. If you look at the comments above and revision history of answer by android116. He answered pretty much the same what your saying. I am again replying the same to you, that I am aware that I can acomplish rounded corners by this means but what I am using is AlertDialog.Builder. The code that I have written is fine for GB but for ICS it does not work. I want to know the reason for that.
  • VendettaDroid
    VendettaDroid over 11 years
    Thanks for the finidings. I will try it out and let you know but I think you deserve the bounty.
  • androidqq6
    androidqq6 over 11 years
    @VendettaDroid THANKS ALOT MY FRIEND im still work on it please if you reach to full solution please tell me , also if i find any solution i will tell you , dont forget to add style and theme to folder ( values-v14), thanks
  • VendettaDroid
    VendettaDroid over 11 years
    Thanks. I will keep you posted.
  • VendettaDroid
    VendettaDroid over 11 years
    Cool, so it works as expected. Thanks for spending your valuable time on it. I really really appreciate it.
  • androidqq6
    androidqq6 over 11 years
    @VendettaDroid YOU ARE ALWAYS WELCOME .
  • Satheesh
    Satheesh almost 11 years
    its working fine but its give rounded rectangle outside of the alert box.which means it gives outlayer as rounded rectangle and inner layer with rectangle please help me.I want only one rounded rectangle layer
  • VAdaihiep
    VAdaihiep about 10 years
    Nice! Edit a little bit because of syntax error: dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
  • enl8enmentnow
    enl8enmentnow over 9 years
    Just set the dialog background to the rounded drawable rather than the view, and you don't need two calls.
  • Rahul Kushwaha
    Rahul Kushwaha over 4 years
    Very Nicely explained .Thanks sir
  • Danny E.K. van der Kolk
    Danny E.K. van der Kolk about 4 years
    Nice and simple solution! However, I had to add '<item name="colorSurface">@color/<your resource></item>' to "MyThemeOverlay.MaterialComponents.MaterialAlertDialog" otherwise my app would crash.
  • Edgar Khimich
    Edgar Khimich almost 3 years
    The best answer!