Android:具有自定义视图和圆angular的AlertDialog

我试图build立一个AlertDialog自定义view (无标题或页脚)和圆angular。 我已经看到了很多关于如何做到这一点的post,我尝试了很多东西,但我不能像我想要的那样构build它。

这是我的目标:

在这里输入图像说明

我为名为dialog_background.xml的dialog创build了一个drawable

 <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#FFAAAAAA" /> <stroke android:width="2dp" android:color="#FF000000" /> <corners android:radius="20dp" /> </shape> 

我添加了一个style来使用它:

 <style name="MyDialog" parent="@android:style/Theme.Dialog"> <item name="android:background">@drawable/dialog_background</item> </style> 

我的自定义viewlayout将有两个button。 现在我向你展示一个空的LinearLayout来简化它。 这是playdialog.xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" style="@style/MyDialog" > </LinearLayout> 

为了build立Dialog我使用了DialogFragment 。 这是它的onCreateDialog函数:

 public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); builder.setView(inflater.inflate(R.layout.playdialog, null)); return builder.create(); } 

好吧,如果我使用这样的代码,我得到这个:

在这里输入图像说明

我试图设置dialog背景透明修改我的DialogFragment代码:

 public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); builder.setView(inflater.inflate(R.layout.playdialog, null)); **NEW** Dialog d = builder.create(); d.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); return d; } 

结果是完全一样的,所以后来我意识到,我的dialog下的白色矩形是从我的自定义view ,而不是从dialog 。 我已经将view的背景设置为dialog_background.xml,所以我不能将其设置为透明,或者我放松了angular落,颜色等。

然后我决定使用dialog_background.xml来修改dialog的背景,让我的视图有一个纯色作为背景。

在我的自定义view layout (playdialog.xml)中,我将style =“@ style / MyDialog”replace为:

 android:background="#FFAAAAAA" 

然后在我的DialogFragment使用这个代码:

 public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); builder.setView(inflater.inflate(R.layout.playdialog, null)); **NEW** Dialog d = builder.create(); d.getWindow().setBackgroundDrawableResource(R.drawable.dialog_background); return d; } 

这是我得到的:

在这里输入图像说明

这几乎是我想要的,但你可以看到我的自定义view边框,所以它不够好。 在这一点上,我不知道还能做些什么。

任何人都知道如何解决它?

谢谢!

Solutions Collecting From Web of "Android:具有自定义视图和圆angular的AlertDialog"

我刚创build了一个自定义提醒对话框。 但是它的angular落不是圆的。

首先为它创build一个布局 –

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="240sp" android:layout_height="wrap_content" android:background="#FFFFFF" tools:ignore="SelectableText" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="1sp" tools:ignore="UselessParent" > <TableLayout android:id="@+id/tablelayout_dialog_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:stretchColumns="1" > <TableRow android:id="@+id/tablerow_dialog_title" android:layout_width="fill_parent" android:layout_height="wrap_content" tools:ignore="UselessParent" > <ImageView android:id="@+id/imageview_dialog_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/alertwhite" android:layout_gravity="center" android:background="#643c3a" android:contentDescription="@string/string_todo"/> <TextView android:id="@+id/textview_dialog_title" android:layout_width="wrap_content" android:layout_height="fill_parent" android:background="#643c3a" android:padding="10sp" android:gravity="center_vertical" android:textColor="#FFFFFF" android:textSize="15sp" /> </TableRow> </TableLayout> <View android:id="@+id/viewline_dialog" android:layout_below="@+id/tablelayout_dialog_title" android:layout_width = "wrap_content" android:layout_height="0.25dip" android:background="#ffffff" android:layout_centerVertical ="true" /> <TextView android:id="@+id/textview_dialog_text" android:layout_below="@+id/viewline_dialog" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="8sp" android:background="#643c3a" android:textColor="#FFFFFF" android:textSize="12sp" /> <View android:id="@+id/viewline1_dialog" android:layout_width = "wrap_content" android:layout_height="0.5dip" android:background="#ffffff" android:layout_centerVertical ="true" android:layout_below="@+id/textview_dialog_text"/> <TableLayout android:id="@+id/tablelayout_dialog_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:stretchColumns="*" android:layout_below="@+id/viewline1_dialog" android:background="#a8a8a8" > <TableRow android:id="@+id/tablerow_dialog_button" android:layout_width="fill_parent" android:layout_height="wrap_content" tools:ignore="UselessParent" > <Button android:id="@+id/button_dialog_yes" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="8sp" android:paddingTop="5sp" android:paddingBottom="5sp" android:background="@drawable/roundedcornerbuttonfordialog_shape" android:text="@string/string_yes" /> <Button android:id="@+id/button_dialog_no" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="8sp" android:paddingTop="5sp" android:paddingBottom="5sp" android:background="@drawable/roundedcornerbuttonfordialog_shape" android:text="@string/string_no" /> </TableRow> </TableLayout> </RelativeLayout> 

现在把对话框的代码写成 –

 public static void callAlert(String message, final Context context){ final Dialog dialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.customdialog_layout); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE)); TextView tvTitle = (TextView) dialog.findViewById(R.id.textview_dialog_title); tvTitle.setText("MyApp.."); TextView tvText = (TextView) dialog.findViewById(R.id.textview_dialog_text); tvText.setText(message); Button buttonDialogYes = (Button) dialog.findViewById(R.id.button_dialog_yes); buttonDialogYes.setOnClickListener(new OnClickListener() { public void onClick(View v) { // Do your stuff... dialog.dismiss(); } }); Button buttonDialogNo = (Button) dialog.findViewById(R.id.button_dialog_no); buttonDialogNo.setOnClickListener(new OnClickListener() { public void onClick(View v) { // Do your stuff... dialog.dismiss(); } }); dialog.show(); } 

并把这个方法称为 –

 String message = "Your Message"; callAlert(message, callingClass.this); 

希望这会帮助你。

在我的情况下,要删除对话框中的边界这个解决scheme是有帮助的:

 dialog.setStyle(DialogFragment.STYLE_NO_FRAME, 0); 

就像这里描述的https://stackoverflow.com/a/19521674/3173384

下面的代码解决了这个问题

 MyDialog mydialog = new MyDialog(this, "for testing", new myOnClickListener() { @Override public void onPositiveButtonClick() { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "I am positive button in the dialog", Toast.LENGTH_LONG).show(); } @Override public void onNegativeButtonClick() { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "I am negative button in the dialog", Toast.LENGTH_LONG).show(); } }); // this will remove rectangle frame around the Dialog mydialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); mydialog.show(); 

谢谢,Nagendra

你为什么不使用你显示的图像,如“这是我的目标:”将你的目标图像保存在可绘制的文件夹中。

 private AlertDialog createAlertDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setView(getLayoutInflater().inflate(R.layout.playdialog, null)); return builder.create(); } 

然后

 AlertDialog dialog = createAlertDialog(); dialog.show();