如何以百分比设置协调者布局的孩子的身高?

时间:2018-11-07 21:13:48

标签: android android-coordinatorlayout bottom-sheet

我要设计一个布局,该布局由以下内容组成:布局顶部的工具栏(应占据屏幕的20%),然后垂直下方在ViewPager(应占据屏幕的60%)和然后,仍在垂直下方,是一个BottomSheet(折叠时应占据屏幕的20%,展开时应占据屏幕的100%)。
现在,我已经这样声明了底部表:

<LinearLayout
    android:id="@+id/BSSECONDTOOLBAR"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="???"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
    android:layout_gravity="bottom"
    android:gravity="bottom"
    android:background="#f44242" />

因为这应该是CoordinatorLayout的直接子代,所以我不能使用layout_weight属性。

我的问题是如何设置BottomSheet的高度百分比?

2 个答案:

答案 0 :(得分:3)

您的问题有两件事要解决。首先是如何使底页在展开时填充父级。

这很简单:设置android:layout_height="match_parent"

然后,我们必须解决的问题是将底页的窥视高度设置为父级的20%。在XML中无法做到这一点,因为CoordinatorLayout不支持权重或百分比​​。因此,我们必须使用Java进行设置。您可以将此代码添加到您的onCreate()方法中:

// assume `coordinator` is your CoordinatorLayout

coordinator.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        coordinator.getViewTreeObserver().removeOnGlobalLayoutListener(this);

        int twentyPercent = (coordinator.getHeight() / 5);

        // make the toolbar 20% of the screen
        View toolbar = findViewById(R.id.your_toolbar_id);
        ViewGroup.LayoutParams toolbarParams = toolbar.getLayoutParams();
        toolbarParams.height = twentyPercent;
        toolbar.setLayoutParams(toolbarParams);

        // make the viewpager the rest of the screen (60%)
        View pager = findViewById(R.id.your_viewpager_id);
        ViewGroup.MarginLayoutParams pagerParams = (ViewGroup.MarginLayoutParams) pager.getLayoutParams();
        pagerParams.topMargin = twentyPercent;
        pagerParams.height = (coordinator.getHeight() - (twentyPercent * 2));
        pager.setLayoutParams(pagerParams);

        // make the bottomsheet 20% of the screen
        View bottomSheet = findViewById(R.id.BSSECONDTOOLBAR);
        BottomSheetBehavior<View> behavior = BottomSheetBehavior.from(bottomSheet);
        behavior.setPeekHeight(twentyPercent);
    }
});

答案 1 :(得分:0)

我知道这为时已晚,但是此答案可能会帮助某人...

我通过以下代码实现了半屏布局。

BottomSheetBehavior.from(bottom_sheet).peekHeight =
        (Resources.getSystem().getDisplayMetrics().heightPixels)/2

我想覆盖任何大小的设备的一半屏幕,因此我除以2后,可以通过更改分频器通过上述代码覆盖所需设备的屏幕大小。

将此代码放入活动中,您的底页将弹出。 (采用onCreate方法)

在代码中,bottom_sheet是赋予底部工作表根布局的ID。