如何在 Android 中创建此类底部表单对话框?

How to do this type of BottomSheet dialogin Android?

我想设计这个activity布局。单击按钮时出现一个底部 sheet。我不知道如何在 sheet 的开始和结束时应用边距。它显示白色 space 而不是黑色 Scrim。

这是我的 BottomSheet 布局

    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/bottom_sheet"
    android:orientation="vertical">

    <TextView
        android:id="@+id/AssignNewTask_TxtView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Assign New Task"
        android:textColor="@color/buttonstartcolor"
        android:textSize="28sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/Select_Tasks_TxtView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Please Select Type Of Task to Assign"
        android:textColor="@color/welcometext"
        android:textSize="16sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/AssignNewTask_TxtView" />

    <RadioGroup
        android:id="@+id/radioGroup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:orientation="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/Select_Tasks_TxtView">

        <RadioButton
            android:id="@+id/NewInstallation_RadioBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:buttonTint="@color/appbarcolor"
            android:text="New Installation"
            android:textColor="@color/welcometext"
            android:textSize="18sp"
            tools:targetApi="lollipop" />

        <RadioButton
            android:id="@+id/Repair_RadioBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:buttonTint="@color/appbarcolor"
            android:text="Repair"
            android:textColor="@color/welcometext"
            android:textSize="18sp"
            tools:targetApi="lollipop" />

        <RadioButton
            android:id="@+id/Service_RadioBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:buttonTint="@color/appbarcolor"
            android:text="Service"
            android:textColor="@color/welcometext"
            android:textSize="18sp"
            tools:targetApi="lollipop" />
    </RadioGroup>

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/AssignNewTaskNext_Button"
        android:layout_width="match_parent"
        android:layout_height="58dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="16dp"
        android:background="@drawable/buttons"
        android:text="Next"
        android:textAllCaps="false"
        android:textColor="@color/white"
        android:textSize="18sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/radioGroup" />

</androidx.constraintlayout.widget.ConstraintLayout>

这是 kotlin 文件


class MainDashBoard : AppCompatActivity() {

    private lateinit var binding: ActivityMainDashBoardBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainDashBoardBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val USER_NAME = "Nikhil"
        binding.toolbar.AppBarActivityTxtView.text = USER_NAME

        binding.toolbar.SettingImgView.setOnClickListener{
            val i = Intent(this,Settings::class.java)
            startActivity(i)
        }
        showATBottomSheet()
    }

    private fun showATBottomSheet() {
        binding.AssignNewTaskButton.setOnClickListener {
            val bottomSheetDialog = BottomSheetDialog(this)
            bottomSheetDialog.setContentView(R.layout.bottom_sheet_assign_task)
            bottomSheetDialog.show()
        }
    }
}

任何人都有关于请回答的任何解决方案。 如果有任何库,则删除它的名称。

要实现这种 BottomSheet,您必须应用以下更改:

1.Add 底部 sheet 布局中根 ConstraintLayout 的开始和结束边距及其左上角和右上角的背景,如下所示:

<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:layout_marginEnd="20dp"
    android:background="@drawable/bottom_sheet">

其中 @drawable/bottom_sheet 是 BottomSheet 背景,如下所示:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@android:color/white" />
    <corners android:topLeftRadius="15dp" android:topRightRadius="15dp"
        android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>
</shape>

最终 Xml 应该是这样的:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:layout_marginEnd="20dp"
    android:background="@drawable/bottom_sheet">

    <TextView
        android:id="@+id/AssignNewTask_TxtView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Assign New Task"
        android:textColor="@color/buttonstartcolor"
        android:textSize="28sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/Select_Tasks_TxtView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Please Select Type Of Task to Assign"
        android:textColor="@color/welcometext"
        android:textSize="16sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/AssignNewTask_TxtView" />

    <RadioGroup
        android:id="@+id/radioGroup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:orientation="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/Select_Tasks_TxtView">

        <RadioButton
            android:id="@+id/NewInstallation_RadioBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:buttonTint="@color/appbarcolor"
            android:text="New Installation"
            android:textColor="@color/welcometext"
            android:textSize="18sp"
            tools:targetApi="lollipop" />

        <RadioButton
            android:id="@+id/Repair_RadioBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:buttonTint="@color/appbarcolor"
            android:text="Repair"
            android:textColor="@color/welcometext"
            android:textSize="18sp"
            tools:targetApi="lollipop" />

        <RadioButton
            android:id="@+id/Service_RadioBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:buttonTint="@color/appbarcolor"
            android:text="Service"
            android:textColor="@color/welcometext"
            android:textSize="18sp"
            tools:targetApi="lollipop" />
    </RadioGroup>

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/AssignNewTaskNext_Button"
        android:layout_width="match_parent"
        android:layout_height="58dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="16dp"
        android:background="@drawable/buttons"
        android:text="Next"
        android:textAllCaps="false"
        android:textColor="@color/white"
        android:textSize="18sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/radioGroup" />

</androidx.constraintlayout.widget.ConstraintLayout>

2.Set 一个透明的 BottomSheet Window 样式在你的 styles.xml 比如:

<style name="MyBottomSheetDialog" parent="Theme.Design.Light.BottomSheetDialog">
   <item name="android:colorBackground">@android:color/transparent</item>
   <item name="android:backgroundDimEnabled">true</item>
   <item name="android:backgroundDimAmount">0.3</item>
   <item name="android:windowFrame">@null</item>
   <item name="android:windowIsTranslucent">true</item>
   <item name="android:windowContentOverlay">@null</item>
</style>

3.Use创建BottomSheet对话框时的上述样式

val bottomSheetDialog = BottomSheetDialog(this, R.style.MyBottomSheetDialog)
bottomSheetDialog.setContentView(R.layout.bottom_sheet_assign_task)
bottomSheetDialog.show()

结果: