如何在安卓中创建自定义圆角对话框

我想做的是:我试图在 android 中创建一个自定义圆角对话框。

现在的情况是:我能够使创建自定义对话框,但它没有圆角。我尝试添加一个选择器,但仍然无法实现圆角。

下面是我的代码:


Java代码:

private void launchDismissDlg() {


dialog = new Dialog(getActivity(), android.R.style.Theme_Dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dlg_dismiss);
dialog.setCanceledOnTouchOutside(true);


Button btnReopenId = (Button) dialog.findViewById(R.id.btnReopenId);
Button btnCancelId = (Button) dialog.findViewById(R.id.btnCancelId);


btnReopenId.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {






}
});




btnCancelId.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {






}
});
dialog.setCanceledOnTouchOutside(false);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
dialog.show();


}

xml代码:





























195678 次浏览

你可以使用背景形状为-

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/transparent"/>
<corners android:radius="10dp" />
<padding android:left="10dp" android:right="10dp"/>
</shape>

详细信息可以查看

创建一个可绘制的XML文件,例如dialog_bg.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid
android:color="@color/white"/>
<corners
android:radius="30dp" />
<padding
android:left="10dp"
android:top="10dp"
android:right="10dp"
android:bottom="10dp" />
</shape>

设置它为背景在你的布局XML:

android:background="@drawable/dialog_bg"

将对话框根视图的背景设置为透明,因为Android将对话框布局置于根视图中,根视图隐藏了自定义布局中的角落。

Java:

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

芬兰湾的科特林:

dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))

您需要完成以下操作:

  • 为对话框的背景创建圆角背景:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    
    
    <solid android:color="#fff" />
    
    
    <corners
    android:bottomLeftRadius="8dp"
    android:bottomRightRadius="8dp"
    android:topLeftRadius="8dp"
    android:topRightRadius="8dp" />
    
    
    </shape>
    
  • Now in your Dialog's XML file in the root layout use that background with required margin:

    android:layout_marginLeft="20dip"
    android:layout_marginRight="20dip"
    android:background="@drawable/dialog_background"
    
  • finally in the java part you need to do this:

    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(layoutResId);
    View v = getWindow().getDecorView();
    v.setBackgroundResource(android.R.color.transparent);
    

This works perfectly for me.

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

这对我很有用

dimen.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>


<integer name="weight">1</integer>


<dimen name="dialog_top_radius">21dp</dimen>


<dimen name="textview_dialog_head_min_height">50dp</dimen>
<dimen name="textview_dialog_drawable_padding">5dp</dimen>


<dimen name="button_dialog_layout_margin">3dp</dimen>




</resources>

styles.xml

<style name="TextView.Dialog">
<item name="android:paddingLeft">@dimen/dimen_size</item>
<item name="android:paddingRight">@dimen/dimen_size</item>
<item name="android:gravity">center_vertical</item>
<item name="android:textColor">@color/black</item>
</style>


<style name="TextView.Dialog.Head">
<item name="android:minHeight">@dimen/textview_dialog_head_min_height</item>
<item name="android:textColor">@color/white</item>
<item name="android:background">@drawable/dialog_title_style</item>
<item name="android:drawablePadding">@dimen/textview_dialog_drawable_padding</item>
</style>


<style name="TextView.Dialog.Text">
<item name="android:textAppearance">@style/Font.Medium.16</item>
</style>


<style name="Button" parent="Base.Widget.AppCompat.Button">
<item name="android:layout_height">@dimen/button_min_height</item>
<item name="android:layout_width">match_parent</item>
<item name="android:textColor">@color/white</item>
<item name="android:gravity">center</item>
<item name="android:textAppearance">@style/Font.Medium.20</item>
</style>


<style name="Button.Dialog">
<item name="android:layout_weight">@integer/weight</item>
<item name="android:layout_margin">@dimen/button_dialog_layout_margin</item>
</style>


<style name="Button.Dialog.Middle">
<item name="android:background">@drawable/button_primary_selector</item>
</style>

dialog_title_style.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">


<gradient
android:angle="270"
android:endColor="@color/primaryDark"
android:startColor="@color/primaryDark" />


<corners
android:topLeftRadius="@dimen/dialog_top_radius"
android:topRightRadius="@dimen/dialog_top_radius" />


</shape>

dialog_background.xml

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

dialog_one_button.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/dailog_background"
android:orientation="vertical">


<TextView
android:id="@+id/dialogOneButtonTitle"
style="@style/TextView.Dialog.Head"
android:text="Process Completed" />


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:orientation="vertical">


<TextView
android:id="@+id/dialogOneButtonText"
style="@style/TextView.Dialog.Text"
android:text="Return the main menu" />


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">


<Button
android:id="@+id/dialogOneButtonOkButton"
style="@style/Button.Dialog.Middle"
android:text="Ok" />


</LinearLayout>


</LinearLayout>


</LinearLayout>

OneButtonDialog.java

package com.example.sametoztoprak.concept.dialogs;


import android.app.Dialog;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;


import com.example.sametoztoprak.concept.R;
import com.example.sametoztoprak.concept.models.DialogFields;


/**
* Created by sametoztoprak on 26/09/2017.
*/


public class OneButtonDialog extends Dialog implements View.OnClickListener {


private static OneButtonDialog oneButtonDialog;
private static DialogFields dialogFields;


private Button dialogOneButtonOkButton;
private TextView dialogOneButtonText;
private TextView dialogOneButtonTitle;


public OneButtonDialog(AppCompatActivity activity) {
super(activity);
}


public static OneButtonDialog getInstance(AppCompatActivity activity, DialogFields dialogFields) {
OneButtonDialog.dialogFields = dialogFields;
return oneButtonDialog = (oneButtonDialog == null) ? new OneButtonDialog(activity) : oneButtonDialog;
}


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.dialog_one_button);
getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));


dialogOneButtonTitle = (TextView) findViewById(R.id.dialogOneButtonTitle);
dialogOneButtonText = (TextView) findViewById(R.id.dialogOneButtonText);
dialogOneButtonOkButton = (Button) findViewById(R.id.dialogOneButtonOkButton);


dialogOneButtonOkButton.setOnClickListener(this);
}


@Override
protected void onStart() {
super.onStart();
dialogOneButtonTitle.setText(dialogFields.getTitle());
dialogOneButtonText.setText(dialogFields.getText());
dialogOneButtonOkButton.setText(dialogFields.getOneButton());
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.dialogOneButtonOkButton:


break;
default:
break;
}
dismiss();
}
}

enter image description here

我做了一个新的方法,没有背景绘图是,使它有CardView作为父,并给它一个app:cardCornerRadius="20dp",然后添加到java类dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

这是另一种制作方法。

最简单的方法是使用from

CardView和它的card:cardCornerRadius

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:id="@+id/cardlist_item"
android:layout_width="match_parent"
android:layout_height="130dp"
card:cardCornerRadius="40dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="@color/white">


<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="12sp"
android:orientation="vertical"
android:weightSum="1">
</RelativeLayout>


</android.support.v7.widget.CardView>

当你创建对话框的时候

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

设置

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

将防止对话框投下阴影。

解决方法是使用

dialog.getWindow().setBackgroundDrawableResource(R.drawable.dialog_rounded_background);

哪里是R.drawable.dialog_rounded_background

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle" android:padding="10dp">
<solid
android:color="@color/dialog_bg_color"/>
<corners
android:radius="30dp" />
</shape>
</item>


</layer-list>

下面是完整的解决方案,如果你想控制对话框的刀尖圆弧半径并保留海拔的影子

对话框:

class OptionsDialog: DialogFragment() {


override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle?): View {
dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
return inflater.inflate(R.layout.dialog_options, container)
}


}

dialog_options.xml布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content">


<androidx.cardview.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="40dp"
app:cardElevation="20dp"
app:cardCornerRadius="12dp">


<androidx.constraintlayout.widget.ConstraintLayout
id="@+id/actual_content_goes_here"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</androidx.constraintlayout.widget.ConstraintLayout>


</androidx.cardview.widget.CardView>
</FrameLayout>

关键是用另一个ViewGroup(这里是FrameLayout)包装CardView,并设置边缘为立面阴影创建空间。

适合任何喜欢用XML做事的人,特别是在使用导航体系结构组件操作来导航到对话框的情况下

你可以使用:

<style name="DialogStyle" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">


<!-- dialog_background is drawable shape with corner radius -->
<item name="android:background">@drawable/dialog_background</item>


<item name="android:windowBackground">@android:color/transparent</item>
</style>

如果你使用材料成分:

CustomDialog.kt

class CustomDialog: DialogFragment() {


override fun getTheme() = R.style.RoundedCornersDialog


}

styles.xml

<style name="RoundedCornersDialog" parent="Theme.MaterialComponents.Dialog">
<item name="dialogCornerRadius">dimen</item>
</style>

在Kotlin,我使用类DoubleButtonDialog.Java与行window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))作为重要的一个

class DoubleButtonDialog(context: Context) : Dialog(context, R.style.DialogTheme) {


private var cancelableDialog: Boolean = true
private var titleDialog: String? = null
private var messageDialog: String? = null
private var leftButtonDialog: String = "Yes"
//    private var rightButtonDialog: String? = null
private var onClickListenerDialog: OnClickListener? = null


override fun onCreate(savedInstanceState: Bundle?) {
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
//requestWindowFeature(android.view.Window.FEATURE_NO_TITLE)
setCancelable(cancelableDialog)
setContentView(R.layout.dialog_double_button)
//        val btnNegative = findViewById<Button>(R.id.btnNegative)
//        btnNegative.visibility = View.GONE
//        if (rightButtonDialog != null) {
//            btnNegative.visibility = View.VISIBLE
//            btnNegative.text = rightButtonDialog
//            btnNegative.setOnClickListener {
//                dismiss()
//                onClickListenerDialog?.onClickCancel()
//            }
//        }
val btnPositive = findViewById<Button>(R.id.btnPositive)
btnPositive.text = leftButtonDialog
btnPositive.setOnClickListener {
onClickListenerDialog?.onClick()
dismiss()
}
(findViewById<TextView>(R.id.title)).text = titleDialog
(findViewById<TextView>(R.id.message)).text = messageDialog
super.onCreate(savedInstanceState)
}


constructor(
context: Context, cancelableDialog: Boolean, titleDialog: String?,
messageDialog: String, leftButtonDialog: String, /*rightButtonDialog: String?,*/
onClickListenerDialog: OnClickListener
) : this(context) {
this.cancelableDialog = cancelableDialog
this.titleDialog = titleDialog
this.messageDialog = messageDialog
this.leftButtonDialog = leftButtonDialog
//        this.rightButtonDialog = rightButtonDialog
this.onClickListenerDialog = onClickListenerDialog
}
}




interface OnClickListener {
//    fun onClickCancel()
fun onClick()
}

在layout中,我们可以创建一个dialog_double_button.xml

    <?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="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="@dimen/dimen_10"
android:background="@drawable/bg_double_button"
android:orientation="vertical"
android:padding="@dimen/dimen_5">


<TextView
android:id="@+id/title"
style="@style/TextViewStyle"
android:layout_gravity="center_horizontal"
android:layout_margin="@dimen/dimen_10"
android:fontFamily="@font/campton_semi_bold"
android:textColor="@color/red_dark4"
android:textSize="@dimen/text_size_24"
tools:text="@string/dial" />


<TextView
android:id="@+id/message"
style="@style/TextViewStyle"
android:layout_gravity="center_horizontal"
android:layout_margin="@dimen/dimen_10"
android:gravity="center"
android:textColor="@color/semi_gray_2"
tools:text="@string/diling_police_number" />


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen_10"
android:gravity="center"
android:orientation="horizontal"
android:padding="@dimen/dimen_5">


<!--<Button
android:id="@+id/btnNegative"
style="@style/ButtonStyle"
android:layout_width="0dp"
android:layout_height="@dimen/dimen_40"
android:layout_marginEnd="@dimen/dimen_10"
android:layout_weight=".4"
android:text="@string/cancel" />-->


<Button
android:id="@+id/btnPositive"
style="@style/ButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="@color/red_dark4"
android:fontFamily="@font/campton_semi_bold"
android:padding="@dimen/dimen_10"
android:text="@string/proceed"
android:textAllCaps="false"
android:textColor="@color/white"
android:textSize="@dimen/text_size_20" />
</LinearLayout>
</LinearLayout>

然后使用drawable.xml as

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid
android:color="@color/white"/>
<corners
android:radius="@dimen/dimen_10" />
<padding
android:left="@dimen/dimen_10"
android:top="@dimen/dimen_10"
android:right="@dimen/dimen_10"
android:bottom="@dimen/dimen_10" />
</shape>

对于API级别>= 28的可用属性android:dialogCornerRadius。要支持以前的API版本需要使用

<style name="RoundedDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:windowBackground">@drawable/dialog_bg</item>
</style>

在dialog_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item >
<shape >
<solid android:color="@android:color/transparent" />
</shape>
</item>
<item
android:left="16dp"
android:right="16dp">
<shape>
<solid
android:color="@color/white"/>
<corners
android:radius="8dp" />


<padding
android:left="16dp"
android:right="16dp" />
</shape>
</item>
</layer-list>

您可以简单地使用MaterialAlertDialogBuilder创建自定义圆角对话框。

首先为材质对话框创建一个样式,如下所示:

<style name="MyRounded.MaterialComponents.MaterialAlertDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
<item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.App.CustomDialog.Rounded
</item>
<item name="colorSurface">@color/YOUR_COLOR</item>
</style>


<style name="ShapeAppearanceOverlay.App.CustomDialog.Rounded" parent="">
<item name="cornerFamily">rounded</item>
<item name="cornerSize">10dp</item>
</style>

然后在Java类中创建Alert Dialog对象,如下所示:

AlertDialog alertDialog =  new MaterialAlertDialogBuilder(this,R.style.MyRounded_MaterialComponents_MaterialAlertDialog)  // for fragment you can use getActivity() instead of this
.setView(R.layout.custom_layout) // custom layout is here
.show();


final EditText editText = alertDialog.findViewById(R.id.custom_layout_text);   // access to text view of custom layout
Button btn = alertDialog.findViewById(R.id.custom_layout_btn);


btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {


Log.d(TAG, "onClick: " + editText.getText().toString());
}
});

这就是你所需要做的。

使用Androidx库和材质组件主题,你可以覆盖getTheme()方法:

import androidx.fragment.app.DialogFragment


class RoundedDialog: DialogFragment() {


override fun getTheme() = R.style.RoundedCornersDialog


//....


}

:

<style name="RoundedCornersDialog" parent="@style/Theme.MaterialComponents.Dialog">
<item name="dialogCornerRadius">16dp</item>
</style>

或者你可以使用材质组件库中包含的MaterialAlertDialogBuilder:

import androidx.fragment.app.DialogFragment
import com.google.android.material.dialog.MaterialAlertDialogBuilder


class RoundedAlertDialog : DialogFragment() {


//...


override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return MaterialAlertDialogBuilder(requireActivity(), R.style.MaterialAlertDialog_rounded)
.setTitle("Test")
.setMessage("Message")
.setPositiveButton("OK", null)
.create()
}


}

:

<style name="MaterialAlertDialog_rounded" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
<item name="shapeAppearanceOverlay">@style/DialogCorners</item>
</style>


<style name="DialogCorners">
<item name="cornerFamily">rounded</item>
<item name="cornerSize">16dp</item>
</style>

enter image description here

如果你不需要DialogFragment就使用MaterialAlertDialogBuilder

我在自定义布局中使用CardView实现了圆角对话框,并设置了它的角半径。

这是我的xml代码。

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottomSheet"
android:layout_width="match_parent"
android:layout_margin="@dimen/padding_5dp"
app:cardCornerRadius="@dimen/dimen_20dp"
android:layout_height="wrap_content">


<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/main_gradient_bg"
android:paddingBottom="32dp">


<TextView
android:id="@+id/subdomain_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_32dp"
android:layout_marginLeft="@dimen/margin_32dp"
android:layout_marginTop="@dimen/margin_50dp"
android:fontFamily="@font/nunito_sans"
android:text="@string/enter_subdomain"
android:textColor="@color/white"
android:textSize="@dimen/size_18sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />




<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen_45dp"
app:layout_constraintLeft_toRightOf="@id/subdomain_label"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_baseline_info_24" />


<EditText
android:id="@+id/subdomain_edit_text_bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen_20dp"
android:layout_marginLeft="@dimen/dimen_20dp"
android:layout_marginEnd="@dimen/dimen_20dp"
android:layout_marginRight="@dimen/dimen_20dp"
android:textColor="@color/white"
android:theme="@style/EditTextTheme"
app:layout_constraintTop_toBottomOf="@id/subdomain_label" />


<Button
android:id="@+id/proceed_btn"
android:layout_width="@dimen/dimen_150dp"
android:layout_height="@dimen/margin_50dp"
android:layout_marginTop="@dimen/margin_30dp"
android:background="@drawable/primary_btn_bg"
android:text="@string/proceed"
android:textAllCaps="false"
android:textColor="@color/white"
android:textSize="@dimen/size_18sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/subdomain_edit_text_bottom_sheet" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>

之后,我在芬兰湾的科特林中调用它,如下所示:-

    val builder = AlertDialog.Builder(mContext)
val viewGroup: ViewGroup = findViewById(android.R.id.content)
val dialogView: View =
LayoutInflater.from(mContext).inflate(R.layout.subdomain_bottom_sheet,
viewGroup, false)
val alertDialog: AlertDialog = builder.create()
alertDialog.setView(dialogView,0,0,0,0)
alertDialog.show()
val windowParam = WindowManager.LayoutParams()
windowParam.copyFrom(alertDialog.window!!.attributes)
windowParam.width = AppConstant.getDisplayMetricsWidth(mContext) - 100
windowParam.height = WindowManager.LayoutParams.WRAP_CONTENT
windowParam.gravity = Gravity.CENTER
alertDialog.window!!.attributes = windowParam
    

   

alertDialog.window!!.setBackgroundDrawable
(ColorDrawable(Color.TRANSPARENT))

其中最后一行非常重要。如果没有这一点,就会在角落后面显示颜色(主要是白色)。

创建一个可绘制的xml文件,比如custom .xml。

然后在自定义对话框布局xml中将其设置为背景:

android:background="@drawable/customd"

最后在自定义Dialog类的java部分,你需要这样做:

public class Customdialoque extends DialogFragment {


public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {


getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));


View view = inflater.inflate(R.layout.activity_customdialoque, container, false);


return view;
}

这里有一个基本的解决方案:

 <style name="Style_Dialog_Rounded_Corner" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:windowBackground">@drawable/dialog_rounded_corner</item>
<item name="android:windowMinWidthMinor">85%</item>
</style>

在Drawable中创建形状:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<corners android:radius="12dp" />
</shape>

在生成器构造函数中传递样式

AlertDialog alert = new AlertDialog.Builder(MainActivity.this,R.style.Style_Dialog_Rounded_Corner).create();

接受的答案确实为我圆角,但除非我切换到材质设计主题,使窗口背景透明没有任何效果,我仍然在圆形背景中看到一个方形的对话框阴影背景。我不想切换到Material主题,因为那会改变日期和时间选择器的功能。

相反,我必须隐藏对话框的几个子视图的背景,以便看到圆形背景。在完成所有这些之后,在代码中添加圆角背景也变得更容易了。因此,这是一个完全编程的(没有XML)解决方案。这在我的DialogFragment子类的onStart方法中:

// add rounded corners
val backgroundShape = GradientDrawable()
backgroundShape.cornerRadius = 10.0f
backgroundShape.setColor(Color.BLUE)
this.dialog.window?.decorView?.background = backgroundShape


// make the backgrounds of the dialog elements transparent so we can see the rounded corner background
val topPanelId = this.context.resources.getIdentifier("topPanel", "id", "android")
val topPanel = this.dialog.findViewById<View>(topPanelId)
topPanel?.setBackgroundColor(Color.TRANSPARENT)
val contentPanelId = this.context.resources.getIdentifier("contentPanel", "id", "android")
val contentPanel = this.dialog.findViewById<View>(contentPanelId)
contentPanel?.setBackgroundColor(Color.TRANSPARENT)
val customPanelId = this.context.resources.getIdentifier("customPanel", "id", "android")
val customPanel = this.dialog.findViewById<View>(customPanelId)
customPanel?.setBackgroundColor(Color.TRANSPARENT)
val buttonPanelId = this.context.resources.getIdentifier("buttonPanel", "id", "android")
val buttonPanel = this.dialog.findViewById<View>(buttonPanelId)
buttonPanel?.setBackgroundColor(Color.TRANSPARENT)

这里是kotlin的另一种方式:

val model = ShapeAppearanceModel()
.toBuilder()
.setAllCorners(CornerFamily.ROUNDED, 32.0f)
.build()
val shape = MaterialShapeDrawable(model)
shape.fillColor = ContextCompat.getColorStateList(context, R.color.white)
ViewCompat.setBackground(dialogContentView, shape)

然后更改对话框窗口

dialog?.window?.setBackgroundDrawableResource(android.R.color.transparent)