我如何为BottomSheet设置Half Expanded状态

时间:2019-04-03 00:52:00

标签: android material-design bottom-sheet

我有底页的布局。

Teacher.find(:all, params: {gender: "male'})

底页布局

Teacher.find(:all, params: { subject: { student: grade == "one" }})

对我来说,我的底页必须打开前半部分,重新​​拖动后才能全屏显示。如何在Google Maps应用中完成。但是我不知道该怎么做。

5 个答案:

答案 0 :(得分:2)

尽管已经回答了这个问题,但是有了另一种实现此行为的方法,可以与他人共享。

创建一个全局变量,并使用 BottomSheetBehavior 的默认状态对其进行初始化,例如

int state = BottomSheetBehavior.STATE_COLLAPSED;

然后,在 BottomSheetBehavior.BottomSheetCallback 中将您的 state 变量更新为当前状态

和中 BottomSheetBehavior.STATE_DRAGGING ,如果状态未扩展一半,则

将状态设置为 BottomSheetBehavior.STATE_HALF_EXPANDED

sheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View view, int i) {
            switch (i) {
                case BottomSheetBehavior.STATE_COLLAPSED:
                    state = BottomSheetBehavior.STATE_COLLAPSED;
                    binder.imgRefresh.setVisibility(View.GONE);
                    break;
                case BottomSheetBehavior.STATE_EXPANDED:
                    binder.imgRefresh.setVisibility(View.VISIBLE);
                    state = BottomSheetBehavior.STATE_EXPANDED;
                    break;
                case BottomSheetBehavior.STATE_DRAGGING:
                    if (state != BottomSheetBehavior.STATE_HALF_EXPANDED) {
                        sheetBehavior.setState(BottomSheetBehavior.STATE_HALF_EXPANDED);
                    }
                    break;
                case BottomSheetBehavior.STATE_HALF_EXPANDED:
                    state = BottomSheetBehavior.STATE_HALF_EXPANDED;
                    break;
            }
        }

        @Override
        public void onSlide(@NonNull View view, float v) {
            binder.viewExtender.setAlpha(1 - v);
        }
    });

这将使您的BottomSheet采取三个步骤,即崩溃半扩展扩展

希望它可以帮助某人!

答案 1 :(得分:2)

最好使用具有全部潜力的框架。正如方法setFitToContents的官方文档所述:

  

设置展开的图纸的高度是由其内容的高度决定的,还是以两个阶段展开(父对象的高度的一半)   容器,父容器的全高)。默认值为true。

因此,您需要通过以下方式将setFitToContent设置为false

behavior = BottomSheetBehavior.from(your_bottom_sheet_xml)
behavior.isFitToContents = false
behavior.halfExpandedRatio = 0.6f

使用此三行代码,底页首先将扩展到屏幕的60%,然后再完全扩展到100%。

希望有帮助!

答案 2 :(得分:1)

只需将 BottomSheetBehaivor 状态设置为 BottomSheetBehavior.STATE_HALF_EXPANDED 。 另外,如果您需要在完全展开后让用户再次回到一半展开模式,则需要将窥视高度设置为窗口高度的一半。

val bottomSheetBehavior = BottomSheetBehavior.from<NestedScrollView>(bottom_sheet)
val metrics = resources.displayMetrics
bottomSheetBehavior.peekHeight = metrics.heightPixels / 2
bottomSheetBehavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED

答案 3 :(得分:1)

class BottomSheetFragment : BottomSheetDialogFragment() {
    /* inside of your Bottom Sheet Dialog Fragment */
    override fun onStart() {
        super.onStart()
        BottomSheetBehavior.from(requireView().parent as View).apply {
        state = BottomSheetBehavior.STATE_HALF_EXPANDED
       }
    }
}

答案 4 :(得分:0)

我尝试了@Massab@HeyAlex,但是与我期望的行为不匹配。

在kotlin中采用以下解决方案,如果您的底片滑动接近扩展状态,则保持扩展状态;如果接近一半状态,则保持一半状态;如果接近崩溃,则保持崩溃状态:

    val bottomSheet = view.findViewById<View>(R.id.bottom_sheet1)
    val mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet)
    mBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
    mBottomSheetBehavior.addBottomSheetCallback(object: BottomSheetBehavior.BottomSheetCallback(){
        override fun onStateChanged(bottomSheet: View, newState: Int) {
        }

        override fun onSlide(bottomSheet: View, slideOffset: Float) {
            val upperState = 0.66
            val lowerState = 0.33
            if(slideOffset >= upperState){
                mBottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
            }
            if(slideOffset > lowerState && slideOffset < upperState){
                mBottomSheetBehavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED
            }
            if(slideOffset <= lowerState){
                mBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
            }
        }
    })