BottomSheetDialogFragment 的圆角不适用于 API <21

Posted

技术标签:

【中文标题】BottomSheetDialogFragment 的圆角不适用于 API <21【英文标题】:Round corner for BottomSheetDialogFragment Not working on API <21 【发布时间】:2019-10-01 02:07:40 【问题描述】:

我正在使用 this solution 来圆角 BottomSheetDialogFragment 中的对话框,它适用于 API 21 及更高版本

但在 Api 如何在 API

【问题讨论】:

您可以在底部工作表对话框中使用cardview,您可以在此处制作圆角@Morteza @g.brahmaDatta 如何去除BottomSheetDialogFragment的背景 背景?哪个背景@Morteza? @g.brahmaDatta 看看第二张照片 哦,买入和卖出按钮之间的白色背景? @Morteza 【参考方案1】:

Morteza 我通过以下代码制作了使 BottomSheetDialog Fragment 对话框圆角的代码,并且我也在 KitKat 移动版中对其进行了测试。

底页对话框类代码

public class MyBottomSheetDialog extends BottomSheetDialogFragment 

String string;

static MyBottomSheetDialog newInstance(String string) 
    MyBottomSheetDialog f = new MyBottomSheetDialog();
    Bundle args = new Bundle();
    args.putString("string", string);
    f.setArguments(args);
    return f;


@Override
public void onCreate(@Nullable Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    string = getArguments().getString("string");
    //bottom sheet round corners can be obtained but the while background appears to remove that we need to add this.
    setStyle(DialogFragment.STYLE_NO_FRAME,0);


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    View v = inflater.inflate(R.layout.bottom_sheet_modal, container, false);
    TextView tv = (TextView) v.findViewById(R.id.text);

    //dialog cancel when touches outside (Optional)
    getDialog().setCanceledOnTouchOutside(true);
    return v;

bottom_sheet_modal.xml

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:id="@+id/linearLayout"
android:orientation="vertical"
android:paddingBottom="10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp"
//adding background from drawable
android:background="@drawable/rounded_dialog">

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:layout_gravity="center"
    android:gravity="center"
    android:weightSum="10"
    android:layout_marginStart="20dp"
    android:layout_marginEnd="20dp">


    <Button
        android:layout_
        android:layout_weight="5"
        android:layout_
        android:text="Buy"
        />

    <Button
        android:layout_
        android:layout_weight="5"
        android:layout_
        android:text="sell"
        />

</LinearLayout>
</LinearLayout>

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="#444343"/>
<corners android:topLeftRadius="16dp"
    android:topRightRadius="16dp"/>

</shape>

MainActivity.java

public class MainActivity extends AppCompatActivity 

BottomSheetDialogFragment bottomSheetDialogFragment;
Button button;
LinearLayout linearLayout;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    bottomSheetDialogFragment = MyBottomSheetDialog.newInstance("Bottom Sheet Dialog");
    button = findViewById(R.id.button);



    button.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            bottomSheetDialogFragment.show(getSupportFragmentManager(),bottomSheetDialogFragment.getTag());
        
    );



试试这个,让我知道@Morteza。编码愉快。

【讨论】:

将其添加到代码中使我的 Fragment 在片段外部单击时不可关闭。【参考方案2】:

创建自定义drawable 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>
        view!!.getViewTreeObserver().addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener 
            override fun onGlobalLayout() 
                if (Build.VERSION.SDK_INT < 16) 
                    view!!.getViewTreeObserver().removeGlobalOnLayoutListener(this)
                 else 
                    view!!.getViewTreeObserver().removeOnGlobalLayoutListener(this)
                
                val dialog = dialog as BottomSheetDialog?
                val bottomSheet =
                    dialog!!.findViewById<View>(com.google.android.material.R.id.design_bottom_sheet) as FrameLayout?

                //Change background Image for all android versions below Api < 21
                bottomSheet!!.setBackgroundResource(R.drawable.rounded_dialog)
            
        )

【讨论】:

【参考方案3】:

对我有用的最简单和最干净的解决方案是将以下 3 行放入我的片段类的 onViewCreated(View view, Bundle savedInstanceState) 方法中:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) 
    View bottomSheet = (View) view.getParent();
    bottomSheet.setBackgroundTintMode(PorterDuff.Mode.CLEAR);
    bottomSheet.setBackgroundTintList(ColorStateList.valueOf(Color.TRANSPARENT));
    bottomSheet.setBackgroundColor(Color.TRANSPARENT);

这将允许您的带有圆角的自定义可绘制对象在设置为片段布局的***视图的背景后正确显示。

本质上,这会覆盖关于颜色、tintMode 和 tintList 的默认 BottomSheetFragment 属性。

使用这个,就不用乱搞样式资源了。

【讨论】:

以上是关于BottomSheetDialogFragment 的圆角不适用于 API <21的主要内容,如果未能解决你的问题,请参考以下文章

如果键盘可见,则防止关闭 BottomSheetDialogFragment

赶上BottomSheetDialogFragment的解雇

Android BottomSheetDialogFragment 闪烁

防止 BottomSheetDialogFragment 覆盖导航栏

BottomSheetDialogFragment - 如何包装内容并完全显示?

BottomSheetDialogFragment 不是模态的