BottomSheetDialogFragment的圆角


111

我有一个自定义的BttomSheetDialogFragment,我想在底部视图的顶部有圆角

这是我的自定义类,它使我想要从底部显示的布局膨胀

View mView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.charge_layout, container, false);
    initChargeLayoutViews();
    return mView;
}

而且我也有这个xml资源文件作为背景:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners android:topRightRadius="35dp"
    android:topLeftRadius="35dp"
    />
<solid android:color="@color/white"/>

<padding android:top="10dp"
    android:bottom="10dp"
    android:right="16dp"
    android:left="16dp"/>

但是问题是,当我将此资源文件设置为布局的根元素的背景时,拐角仍未圆化

而且我不能使用下面的代码:

    this.getDialog().getWindow().setBackgroundDrawableResource(R.drawable.charge_layout_background);

因为它覆盖了BottomSheetDialog的默认背景,并且在我的Bottom View上方没有任何半透明的灰色


5
@RasoolGhana -看一看这个链接:medium.com/halcyon-mobile/...
莫希特Charadva

Answers:


229

创建一个自定义可绘制对象rounded_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@android:color/white"/>
    <corners android:topLeftRadius="16dp"
        android:topRightRadius="16dp"/>

</shape>

然后覆盖bottomSheetDialogThemestyles.xml使用可绘制背景:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">       
    <item name="bottomSheetDialogTheme">@style/AppBottomSheetDialogTheme</item>
</style>

<style name="AppBottomSheetDialogTheme"
    parent="Theme.Design.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/AppModalStyle</item>
</style>

<style name="AppModalStyle"
    parent="Widget.Design.BottomSheet.Modal">
    <item name="android:background">@drawable/rounded_dialog</item>
</style>

这将更改您应用程序的所有BottomSheetDialogs。


2
这个对我有用。我也注意到它取决于布局根元素。首先,我以root身份使用cardview(因为我尝试了另一种方法来修圆角),然后将其更改为线性布局,现在它可以正常工作了
Ivan Shafran

1
Android API 17崩溃
Morteza Rastgoo,

1
我不会将rounded_dialogAppModalStyle名称与仅将顶角修圆的背景一起使用,因为您只会期望将这种背景与底页样式一起使用。如何bottomsheet_rounded_backgroundAppBottomSheetStyle
HMAC

3
请注意,如果您在根视图上指定了背景,则它将覆盖此设置
hmac

2
确保您在图纸布局的根元素上没有任何背景!
MMK

81

使用新的Material Component库,您可以使用样式中的属性来自定义组件的形状shapeAppearanceOverlay注意:它需要版本1.1.0

只需使用BottomSheetDialogFragment覆盖onCreateView方法,然后为“底表对话框”定义自定义样式。

在您的应用主题中定义bottomSheetDialogTheme属性styles.xml

  <!-- Base application theme. -->
  <style name="AppTheme" parent="Theme.MaterialComponents.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    ....
    <item name="bottomSheetDialogTheme">@style/CustomBottomSheetDialog</item>
  </style>

然后只需定义您喜欢的形状 shapeAppearanceOverlay

  <style name="CustomBottomSheetDialog" parent="@style/ThemeOverlay.MaterialComponents.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/CustomBottomSheet</item>
  </style>

  <style name="CustomBottomSheet" parent="Widget.MaterialComponents.BottomSheet">
    <item name="shapeAppearanceOverlay">@style/CustomShapeAppearanceBottomSheetDialog</item>
  </style>

  <style name="CustomShapeAppearanceBottomSheetDialog" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSizeTopRight">16dp</item>
    <item name="cornerSizeTopLeft">16dp</item>
    <item name="cornerSizeBottomRight">0dp</item>
    <item name="cornerSizeBottomLeft">0dp</item>
  </style>

在此处输入图片说明


您可以在您的应用程序中获得相同的行为来替代此方法BottomSheetDialogFragment(而不是bottomSheetDialogTheme在应用程序主题中添加):

@Override public int getTheme() {
    return R.style.CustomBottomSheetDialog;
  }

在这种情况下,您仅在单个BottomSheetDialogFragment应用程序中而不是在所有应用程序中都使用此themeOverlay 。


关于扩展状态的重要说明

在扩展状态下,BottomSheet具有平角。您可以在github repo中查看官方评论:

我们的设计团队强烈认为,圆角表示可滚动的内容,而平角表示没有其他内容。因此,他们不希望我们使用fitToContents添加此更改。

此行为由提供,BottomSheetBehavior并且无法覆盖它。
但是,有一种解决方法->免责声明:它可能会在下一版本中停止工作!

您可以添加BottomSheetCallbackBottomSheetDialogFragment

  @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);


    ((BottomSheetDialog)dialog).getBehavior().addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {

      @Override public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_EXPANDED) {
          //In the EXPANDED STATE apply a new MaterialShapeDrawable with rounded cornes
          MaterialShapeDrawable newMaterialShapeDrawable = createMaterialShapeDrawable(bottomSheet);
          ViewCompat.setBackground(bottomSheet, newMaterialShapeDrawable);
        }
      }

      @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) {

      }
    });

    return dialog;
  }

  @NotNull private MaterialShapeDrawable createMaterialShapeDrawable(@NonNull View bottomSheet) {
    ShapeAppearanceModel shapeAppearanceModel =

      //Create a ShapeAppearanceModel with the same shapeAppearanceOverlay used in the style
      ShapeAppearanceModel.builder(getContext(), 0, R.style.CustomShapeAppearanceBottomSheetDialog)
        .build();

      //Create a new MaterialShapeDrawable (you can't use the original MaterialShapeDrawable in the BottoSheet)
      MaterialShapeDrawable currentMaterialShapeDrawable = (MaterialShapeDrawable) bottomSheet.getBackground();
      MaterialShapeDrawable newMaterialShapeDrawable = new MaterialShapeDrawable((shapeAppearanceModel));
      //Copy the attributes in the new MaterialShapeDrawable
      newMaterialShapeDrawable.initializeElevationOverlay(getContext());
      newMaterialShapeDrawable.setFillColor(currentMaterialShapeDrawable.getFillColor());
      newMaterialShapeDrawable.setTintList(currentMaterialShapeDrawable.getTintList());
      newMaterialShapeDrawable.setElevation(currentMaterialShapeDrawable.getElevation());
      newMaterialShapeDrawable.setStrokeWidth(currentMaterialShapeDrawable.getStrokeWidth());
      newMaterialShapeDrawable.setStrokeColor(currentMaterialShapeDrawable.getStrokeColor());
      return newMaterialShapeDrawable;
  }

2
@GabrieleMariotti使用此技术,如果我在纸上的某个位置点击但未被消除,则角会动画。我不确定您是否使用Android材质组件进行开发,但是如果您使用Android材质组件,是否知道这个问题?我使用的是1.1.0-alpha10,但我也刚刚检查了beta2。我不确定这是否取决于我在工作表中输入的确切视图。
androidguy

1
我已经报告了这个问题:issuetracker.google.com/issues/144859239如果有人对这个问题有任何进一步的发现或解决方案,请回复。谢谢!
androidguy

4
我收到此错误并在v1.1.0-beta02上崩溃Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior
hkchakladar

3
如果展开底部工作表对话框,则无法使用。任何的想法?
何塞·卡洛斯·

4
这是完美的最新答案。我需要将此标记为答案
Vikas Acharya

38

BottomSheetDialog被设置默认的白色背景颜色,这就是为什么角落是不可见的,为了向他们展示,你需要通过重写的风格,使对话框的背景透明BottomSheetDialog

在您的中定义此样式 res/values/styles/styles.xml

<style name="BottomSheetDialog" parent="Theme.Design.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/bottomSheetStyleWrapper</item>
</style>

<style name="bottomSheetStyleWrapper" parent="Widget.Design.BottomSheet.Modal">
    <item name="android:background">@android:color/transparent</item>
</style>

并将此样式设置为您的BottomSheetDialog

View view = getLayoutInflater().inflate(R.layout.chooser_bottom_sheet, null);
BottomSheetDialog dialog = new BottomSheetDialog(this,R.style.BottomSheetDialog); // Style here
dialog.setContentView(view);
dialog.show();

2
比接受的答案更好,因为这样您可以在不同的BottomSheetDialogs上具有不同的背景
路加福音

现在可以看到曲线,但是触摸时整个屏幕上的透明颜色只有底部对话框上的白色可见。
阿诺德·布朗

它在这里工作。谢谢!
Michel Fernandes

那就是我一直在寻找的解决方案,完全免费。
Prateek Gupta

26

创建一个名为rounded_corners_shape的形状

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <corners
        android:topLeftRadius="8dp"
        android:topRightRadius="8dp"/>
    <solid android:color="@color/white"/>

</shape>

定义风格

  <style name="AppBottomSheetDialogTheme"
           parent="Theme.Design.Light.BottomSheetDialog">
        <item name="bottomSheetStyle">@style/AppModalStyle</item>
    </style>

    <style name="AppModalStyle" parent="Widget.Design.BottomSheet.Modal">
        <item name="android:background">@drawable/rounded_corners_shape</item>
    </style>

在您的自定义BottomSheetDialogFragment上使用这种样式,这样就可以了!

 public class CustomDialogFragment extends BottomSheetDialogFragment {
      @Override
      public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NORMAL, R.style. AppBottomSheetDialogTheme);
      }

      ...
    }

如果在代码中添加一些说明,将很有帮助。
UditS

这是为设置主题的正确位置Fragment
DYS

10

如果您使用的是材料组件最新版本,则只需要覆盖ShapeAppearance.MaterialComponents.LargeComponent(因为底页使用此形状)并设置所需的值,例如:

 <style name="ShapeAppearance.YourApp.LargeComponent" parent="ShapeAppearance.MaterialComponents.LargeComponent">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">12dp</item>
 </style>

然后设置您的应用样式:

<item name="shapeAppearanceLargeComponent">@style/ShapeAppearance.YourApp.LargeComponent</item>

Gabriele Mariotti的解决方案相似并且也可以工作,但是这一解决方案更简单。


与其他解决方案相比,它是一个更好的解决方案,因为那里的大多数解决方案都基于设置的自定义可绘制对象
d-feverx

1
看起来不错。这也适用BottomSheetDialog吗?
贾登·古

1
所有人注意:使用此答案将使所有使用的组件ShapeAppearance.MaterialComponents.LargeComponent具有相同的cornerSize和family,而不仅仅是Bottom Sheet。检查您的样式要求,然后决定是要更改所有组件的外观,还是要更改单个组件或小部件的外观。
nitinkumarp

8

我今天正在检查同一件事,是的,您对以下代码是正确的

this.getDialog().getWindow().setBackgroundDrawableResource(R.drawable.charge_layout_background);

这适用于片段背景,因此您应该从对话框窗口获取底部视图并更改背景,这里是代码

 @SuppressLint("RestrictedApi")
    @Override
    public void setupDialog(Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        View rootView = getActivity().getLayoutInflater().inflate(R.layout.view_member_info,null,false);
        unbinder = ButterKnife.bind(this, rootView);
        adjustUIComponents();
        dialog.setContentView(rootView);
        FrameLayout bottomSheet = (FrameLayout) dialog.getWindow().findViewById(android.support.design.R.id.design_bottom_sheet);
        bottomSheet.setBackgroundResource(R.drawable.container_background);
    }

底表是您要更改的实际视图。


我得到这个工作的唯一途径。顺便说一句我正在使用,BottomSheetDialogFragment以便逻辑在onCreateDialog方法中
Kirill Starostin 19/12/11

8

通过回答科马业另一个问题为我工作,你应该尝试一下。

在drawable中创建一个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根节点中:

将其设置为布局xml中的背景

android:background="@drawable/dialog_bg"

onCreateView()把这个:

将对话框的背景设置为透明

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

这应该是正确的解决方案,因为它适用于所有DialogFragments,而无需跳到箍上。
jssingh '18

3
对我来说,圆角后面仍然有白色的角落。因此,当我将可绘制对象的颜色更改为红色时,您的代码可以正常工作并创建一个圆形的红色矩形,但是在其后面仍然有一个默认的白色矩形。您编写的“ dialog.getWindow()。setBackgroundDrawable ...”代码更改了对话框上方整个“变暗”区域的颜色,但同样,它错过了这两个小角。您知道什么可能导致此问题吗?
Nick Dev

在上面的评论中,我应该注意,为了使我的代码能够运行,必须将onCreateView()中的代码更改为getDialog(). getWindow()...”。也许这就是为什么它对我不起作用的原因。
尼克·德夫

1
@NickDev如果您认为此解决方案不适用于您的代码,请发布新问题,也许我们会找到解决方案。
瓦里亚格

@Variag感谢您的联系;实际上,我想出了一个便宜的解决方法,在该默认解决方法中,我用一个矩形与其下面的黑色区域相同的颜色覆盖了默认的底部工作模式对话框。然后,我在上面添加了另一个带有圆角的矩形。这不是理想的,但是看起来不错!不过,我感谢您的帮助。
Nick Dev '18年

6
  1. 创建一个可绘制的形状..我们将其用作底部工作表的背景。为左上角和右上角的半径提供适当的值。

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <corners
            android:topLeftRadius="24dp"
            android:topRightRadius="24dp" />
        <padding android:top="2dp" />
        <solid android:color="@color/white" />
    </shape>
    
  2. 现在为“底表对话框片段”创建样式

    <style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal">
            <item name="android:background">@drawable/drawable_bottomsheet_background</item>
        </style>
    
        <style name="BaseBottomSheetDialog" parent="@style/Theme.Design.Light.BottomSheetDialog">
            <item name="android:windowIsFloating">false</item>
            <item name="bottomSheetStyle">@style/BottomSheet</item>
        </style>
    
        <style name="BottomSheetDialogTheme" parent="BaseBottomSheetDialog" />
    
  3. 现在创建一个自定义类,该类将扩展BottomSheetDilogFragment,在其中您可以提供样式。

    open class CustomRoundBottomSheet : BottomSheetDialogFragment() {
    
        override fun getTheme(): Int = R.style.BottomSheetDialogTheme
    
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = BottomSheetDialog(requireContext(), theme)
    
    }
    
  4. 现在,在任何想要有圆角底片的地方使用此类。例如

    class BottomSheetSuccess : CustomRoundBottomSheet() {
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.bottomsheet_shopcreate_success, container, false)
        }
    
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
        }
    
    } 
    

5

对我有用

创建一个名为shape_rounded_dialog的形状

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/color_white" />
<corners
    android:topLeftRadius="16dp"
    android:topRightRadius="16dp" />

添加以下样式

<style name="AppBottomSheetDialogTheme" parent="Theme.MaterialComponents.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/CustomBottomSheetStyle</item>
</style>

<style name="CustomBottomSheetStyle" parent="Widget.Design.BottomSheet.Modal">
    <item name="android:background">@drawable/shape_rounded_dialog</item>
</style>

在DialogFragment类中,方法重写getTheme也将返回Yourself样式。

@Override
public int getTheme() {
    return R.style.AppBottomSheetDialogTheme;
}

4

此答案仅适用于Color.TRANSPARENT在将具有圆形背景的可绘制对象设置到版面之后将背景色设置为的问题。

Color.TRANSPARENT除了覆盖setupDialog()解决方案外,没有答案对我来说将背景色设置为:

@Override
public void setupDialog(Dialog dialog, int style) {
    super.setupDialog(dialog, style);
    View contentView = View.inflate(getContext(), 
R.layout.fragment_bottom_sheet, null);
    dialog.setContentView(contentView);
    ...
    ((View) contentView.getParent()).setBackgroundColor(ContextCompat.getColor(getContext(), android.R.color.transparent));
}

contentView你的对话框中设置在这里是不view你得到onViewCreated()的充气时onCreateView()。它破坏了标准流程,因此可能会产生无法使用的麻烦View Bindings-Kotlin Android ExtensionsonViewCreated()

所以我做了一些调整来设置背景onActivityCreated()

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    (view?.parent as View).setBackgroundColor(Color.TRANSPARENT)
  }

希望对遇到同样麻烦的人有所帮助


2

我知道这个问题已经有一个可以接受的答案。我想记录一下我遇到的问题以及最终如何使它起作用,因此它对将来的某个人很有用。

首先,我是Theme.AppCompat.Light.DarkActionBar作为我们的父母AppTheme。这意味着@Gabriele Mariotti解决方案不断因错误而崩溃Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior。我通过简单地将父级更改为Theme.MaterialComponents.Light.DarkActionBar。这丝毫没有影响我们的主题,但是RTE消失了。您还可以通过简单地将所需项目包括到样式中来解决此问题。但是我不必费心弄清楚BottomSheetBehavior需要哪些样式。

其次,尽我所能,但是我无法获得实际的Frame布局(这是BottomSheetDialogFragment)使用的圆角。我意识到将其设置为Drawable可以工作,但是不能使用形状或@null。原来,这是因为LinearLayout我正在使用的对象具有定义的背景。这将覆盖样式中的所有背景。删除该标记最终导致圆角。

另外,我不需要将任何背景形状设置为圆角。我进行上述更改后,@ Gabriele Mariotti的解决方案便开始起作用。但是,要设置我想要的背景颜色,我必须覆盖“ backgroundTint”项目。

PS:我是Android开发人员的新手,并且正在维护一个供我学院内部使用的旧应用程序。我对Android的布局系统或材质库不是很熟悉。我想这就是为什么我花了3天的时间才弄清楚这一点的原因。我希望这对将来的某人有用。


1

在您的BottomsheetDialogFragment类中添加这两个方法。

public void setDialogBorder(Dialog dialog) {
        FrameLayout bottomSheet = (FrameLayout) dialog.getWindow().findViewById(android.support.design.R.id.design_bottom_sheet);
        bottomSheet.setBackground(new ColorDrawable(Color.TRANSPARENT));
        setMargins(bottomSheet, 10, 0, 10, 20);
    }

    private void setMargins(View view, int left, int top, int right, int bottom) {
        if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
            ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
            p.setMargins(left, top, right, bottom);
            view.requestLayout();
        }
    }

现在setDialogBorder(dialog)setupDialog()BottomsheetDialogFragment类的方法中调用method 。

现在在可绘制文件夹中创建一个形状文件。

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

    <solid android:color="@color/white" />
    <stroke
        android:width="1dp"
        android:color="@color/transparent" />
</shape>

现在,在xml文件中为父视图组对话框视图设置背景。

android:background="@drawable/round_border_white"

做完了!


您对setMargins使用哪个视图?
tmm1

FrameLayout bottomSheet; 这是在setDialogBorder()方法中定义的。这实际上是android底部工作表对话框的默认视图。它将正常工作。
DalveerSinghDaiya

0

解决此问题的另一种方法是扩展BottomSheetDialog并创建适合您需要的自定义类。您可以对布局xml文件执行相同的操作,并添加背景或所需的任何其他自定义设置。这还有一个好处,即您无需依赖于Android使用的ID名称(android.support.design.R.id.design_bottom_sheet),同时可以更改背景(尽管ID名称的更改很少发生在AFAIK上)。


0

创建一个带有圆角的自定义绘图,并将其设置为BottomSheetDialogFragment的布局根的背景

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

<solid android:color="@color/colorPrimary" />

<corners
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    android:topLeftRadius="12dp"
    android:topRightRadius="12dp" />

</shape>

然后只需将以下代码添加到您的BottomSheetDialogFragment类中

@Override
public void setupDialog(Dialog dialog, int style) {
    super.setupDialog(dialog, style);
    View contentView = View.inflate(getContext(), 
R.layout.fragment_bottom_sheet, null);
    dialog.setContentView(contentView);

    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent())
            .getLayoutParams();
    CoordinatorLayout.Behavior behavior = params.getBehavior();
    ((View) contentView.getParent()).setBackgroundColor(ContextCompat.getColor(getContext(), android.R.color.transparent));
}

您甚至可以使用参数来设置边距,如下所示

params.setMargins(50, 0, 50, 0);

0

您必须更改bottom sheet theme才能实现顶层布局

创建一个自定义的可绘制background_bottom_sheet_dialog_fragment.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle">
    <corners
       android:topLeftRadius="8dp"
        android:topRightRadius="8dp" />
    <padding android:top="0dp" />
    <solid android:color="@color/white" />
</shape>

然后使用drawable作为背景覆盖styles.xml上的bottomSheetDialogTheme:

<!--Bottom sheet-->
<style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal">
    <item 
    name="android:background">@drawable/background_bottom_sheet_dialog_fragment
    </item>
</style>

<style name="BaseBottomSheetDialog" 
    parent="@style/Theme.Design.Light.BottomSheetDialog">
    <item name="android:windowIsFloating">false</item>
    <item name="bottomSheetStyle">@style/BottomSheet</item>
</style>

<style name="BottomSheetDialogTheme" parent="BaseBottomSheetDialog" />

这将更改底部工作表的背景布局

BottomSheetDialog

class SheetFragment() : BottomSheetDialogFragment() {

    lateinit var binding: SheetFragmentBinding;

  override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog;
    val view = View.inflate(context, R.layout.fragment_bottom_sheet, null);

    binding = DataBindingUtil.bind(view)!!;
    binding.viewModel = SheetFragmentVM();

    dialog.setContentView(view);

    var bottomSheetBehavior = BottomSheetBehavior.from(view.parent as View);
    bottomSheetBehavior.setPeekHeight(BottomSheetBehavior.PEEK_HEIGHT_AUTO);

    bottomSheetBehavior.setBottomSheetCallback(object : 
     BottomSheetBehavior.BottomSheetCallback() {
        override fun onStateChanged(bottomSheet: View, newState: Int) {
            if (BottomSheetBehavior.STATE_EXPANDED == newState) {
               // do on STATE_EXPANDED
            }
            if (BottomSheetBehavior.STATE_COLLAPSED == newState) {
                // do on STATE_COLLAPSED
            }

            if (BottomSheetBehavior.STATE_HIDDEN == newState) {
                dismiss()

            }
        }

        override fun onSlide(bottomSheet: View, slideOffset: Float) {
           // do on slide
        }
    })

    return dialog
}

0

添加带有圆角的形状,使其成为根布局的背景

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

使背景在您的BottomSheetDialogFragment上透明

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    (view?.parent as View).setBackgroundColor(Color.TRANSPARENT)
}

其适用于约束布局,框架布局,线性布局,相对布局。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.