带有圆angular的Android AlertDialog

我一直在试图使我的警报对话框圆angular,但不知何故,我无法。 我已经尝试过,但是失败了。 我试图按照这个博客http://blog.stylingandroid.com/archives/271,并根据这个做了我的风格。

顺便说一句,现在添加到我的问题。 我的一些新发现。 上述链接的代码在2.3.3(GB)上正常工作,但在ICS中完全不起作用。 一些更改使代码中断。

我想避免创build9个补丁图像,因此我正在使用形状。 9补丁图像是我会尝试的最后一件事。我知道android alert对话框样式是使用9个补丁图像。 在提出这个问题之前,我已经看过了。

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

我的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(); } }); 

}

我目前的输出:

我没有得到任何圆angular。 我可以看到,这是不同于平时的风格。 即使我改变可绘制的半径,angular落也不会反映这些变化。

在这里输入图像说明

Solutions Collecting From Web of "带有圆angular的Android AlertDialog"

你可以使用下面的代码:

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> 

只需更改半径值:

dialog_title.xml

dialog_footer.xml

这将产生以下输出:

在这里输入图像说明

希望这会帮助你。


更新:
我不是专家,但这是我发现的。 这可能是对还是错。 经过多次尝试,我最终得出以下结论:

1- ContextThemeWrapper不适用于API 14,它在姜饼和旧版本上工作正常,但API> 10它不起作用。

2-为了克服上述问题,并按要求使其在API> 10上工作,我将其replace为:

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

有了这个:

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

但你需要改变:

 android:minSdkVersion="8" 

 android:minSdkVersion="11" 

结果将如ICS(API 14)上的下图所示:

在这里输入图像说明

此图片来自运行ICS的Samsung Galaxy S3。

注意:用API 14 SO manifest sdk启动的修改项目将是:

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

最后的话:作为我在Android开发方面的小知识(我不是专家),

1-自定义警报对话框在API <10但不是> 10中使用相同的Java代码平稳运行,

如果我们希望它在ICS中运行,其效果与API <10中的相同, 我们需要修改代码 ,所以它将在ICS上运行,但不会在任何版本的API 11中运行。

2-即使ICS的结果不理想,圆angular只适用于标题而不适用于页脚。


第二次更新:最后,我四处寻找,

dialog_footer.xmlpadding应用于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" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> 

输出图像:

在这里输入图像说明

此图片来自运行ICS的Samsung Galaxy S3。

从@iDroid Explorer的答案只是一个步骤

当你build立对话框时添加这一行

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

这将得到矩形消失(实际上是透明的),并得到一个完美的圆angular对话框。

我已经尝试与下面的一个相同的问题,它适用于我。 即使是ICS也。

首先我把主题放到我的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.然后实现了对话框视图的自定义布局

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.现在将形状添加到pop_exit.xml的父级布局的背景中

round.xml //形状文件

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

我只是做。 它也适用于你的ICS

希望它会帮助你。 如果没有,那么让我知道。

享受编码…

🙂

当你说你不想使用9补丁图像,看看这里。

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

原理是完全一样的,除了你分配背景到你的布局,这个例子是线性布局。

  1. 使用dialog_corner在可绘制文件夹中创buildxml。

     <?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.input布局

    机器人:背景= “@绘制/ dialog_corner”

    在你的java文件中保留下面的代码

查看mView = LayoutInflater.from(mContext).inflate(R.layout.layout_pob,null); alertDialog.getWindow()。setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));