我在我的项目中使用了 BottomSheetDialogFragment,我将其设计如下:



目标:我将把 BottomSheetDialog 的底部菜单粘贴到屏幕底部,在任一模式下折叠和展开。

所以在BottomSheetDialog布局中,我使用RelativeLayout作为父级,使用“layout_alignParentBottom”作为菜单容器,如下:

<RelativeLayout 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:id="@+id/bottomSheetContainer" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_gravity="center_horizontal" 
app:behavior_hideable="true" 
app:behavior_peekHeight="0dp" 
app:layout_behavior="android.support.design.widget.BottomSheetBehavior" 
tools:context=".MyBottomSheetDialogFragment"> 
 
<RelativeLayout 
    android:id="@+id/topSection" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true"> 
    .... 
</RelativeLayout> 
 
<android.support.v4.widget.NestedScrollView 
    android:id="@+id/descriptionContainer" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/topSection"> 
    .... 
</android.support.v4.widget.NestedScrollView> 
 
<HorizontalScrollView 
    android:id="@+id/iconsContainer" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true"> 
    .... 
</HorizontalScrollView> 
</RelativeLayout> 

但对话如下:



如您所见,底部菜单一开始是不可见的。

有人可以帮我解决这个问题吗?

请您参考如下方法:

为了解决这个问题,我尝试时想到了几件事,但我没有成功。

但这最终通过这种方式为我解决了:

对于折叠模式,我将 bottomSheetBehavior 的 peekHeight 设置为屏幕的 1/3(使用以下代码):

    View bottomSheetContainer = dialog.findViewById(R.id.bottomSheetContainer); 
    View parent = (View) bottomSheetContainer.getParent(); 
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) parent.getLayoutParams(); 
    BottomSheetBehavior bottomSheetBehavior = (BottomSheetBehavior) params.getBehavior(); 
    View inflatedView = View.inflate(getContext(), R.layout.word_details_bottom_sheet, null); 
    inflatedView.measure(0, 0); 
    int screenHeight = getActivity().getResources().getDisplayMetrics().heightPixels; 
 
    if (bottomSheetBehavior != null) { 
        bottomSheetBehavior.setPeekHeight(screenHeight /3); 
    } 

所以我决定这样做:

1- 对于折叠模式:bottomSheet 容器的高度 = bottomSheetBehavior 的 peekHeight

2- 展开模式:bottomSheet 容器的高度 = 全屏高度

所以我写了以下代码(完整代码):

WordDetailsBottomSheet.java
public class WordDetailsBottomSheet extends BottomSheetDialogFragment { 
 
public WordDetailsBottomSheet() { // Required empty public constructor } 
 
@NotNull 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    BottomSheetDialog dialog = new BottomSheetDialog(getActivity(), 0); 
    dialog.setContentView(R.layout.word_details_bottom_sheet); 
 
    View bottomSheetContainer = dialog.findViewById(R.id.bottomSheetContainer); 
    View parent = (View) bottomSheetContainer.getParent(); 
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) parent.getLayoutParams(); 
    BottomSheetBehavior bottomSheetBehavior = (BottomSheetBehavior) params.getBehavior(); 
    View inflatedView = View.inflate(getContext(), R.layout.word_details_bottom_sheet, null); 
    inflatedView.measure(0, 0); 
    int screenHeight = getActivity().getResources().getDisplayMetrics().heightPixels; 
    int statusBarHeight = getStatusBarHeight(); 
 
    if (bottomSheetBehavior != null) { 
        bottomSheetBehavior.setPeekHeight(screenHeight / BOTTOM_SHEET_PEEK_HEIGHT_PERCENT); 
        bottomSheetContainer.getLayoutParams().height = bottomSheetBehavior.getPeekHeight(); 
    } 
 
    bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { 
        @Override 
        public void onStateChanged(@NonNull View view, int newState) { 
            switch (newState) { 
                case BottomSheetBehavior.STATE_EXPANDED: 
                    bottomSheetContainer.getLayoutParams().height = screenHeight-statusBarHeight; 
                    break; 
                case BottomSheetBehavior.STATE_COLLAPSED: 
                    bottomSheetContainer.getLayoutParams().height = bottomSheetBehavior.getPeekHeight(); 
                    break; 
                case BottomSheetBehavior.STATE_HIDDEN: 
                    dismiss(); 
                    break; 
                default: 
                    break; 
            } 
        } 
 
        @Override 
        public void onSlide(@NonNull View view, float slideOffset) { 
        } 
    }); 
 
    return dialog; 
} 
 
public int getStatusBarHeight() { 
    int result = 0; 
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
    if (resourceId > 0) { 
        result = getResources().getDimensionPixelSize(resourceId); 
    } 
    return result; 
    } 
} 

word_details_bottom_sheet.xml
<RelativeLayout 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:id="@+id/bottomSheetContainer" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_gravity="center_horizontal" 
app:behavior_hideable="true" 
app:behavior_peekHeight="0dp" 
app:layout_behavior="android.support.design.widget.BottomSheetBehavior" 
tools:context=".MyBottomSheetDialogFragment"> 
 
<RelativeLayout 
android:id="@+id/topSection" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentTop="true"> 
.... 
</RelativeLayout> 
 
<android.support.v4.widget.NestedScrollView 
android:id="@+id/descriptionContainer" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_below="@id/topSection"> 
.... 
</android.support.v4.widget.NestedScrollView> 
 
<HorizontalScrollView 
android:id="@+id/iconsContainer" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true"> 
.... 
</HorizontalScrollView> 
</RelativeLayout> 

在 xml 文件中,重要的是:

1- 父 id (android:id="@+id/bottomSheetContainer")

2-iconsContainer 对齐 (android:layout_alignParentBottom="true")


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!