安卓底部菜单表在状态改变后的表现

7

我有一个带有底部面板的屏幕,但为了在活动之间实现过渡和动画效果,当用户按下返回键时,我需要将底部面板折叠起来。我尝试了以下方法:

@Override
public void onBackPressed(){
    if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_COLLAPSED) {
        super.onBackPressed();
    } else {
        mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
        super.onBackPressed();
    }

    mShowingBack = false;
}

然而,由于活动返回时底部表单仅下降了一半,这种方法不起作用。
2个回答

20

BottomSheetBehavior.STATE_COLLAPSED并没有隐藏所有的BottomSheet,它只是将视图的高度设置为您使用setPeekHeight()或在xml中使用behavior_peekHeight设置的高度 :) 但是抛开这个不谈...当BottomSheet的状态为STATE_COLLAPSED时,您应该在BottomSheetBehaviorCallback中调用super.onBackPressed(),像这样:

BottomSheetBehavior behavior = BottomSheetBehavior.from(mBottomSheetBehavior);  
behavior.addBottomSheetCallback(new BottomSheetCallback() {  
   @Override  
   public void onStateChanged(@NonNull View bottomSheet, int newState) {  
     if (newState == BottomSheetBehavior.STATE_COLLAPSED && mIsCollapsedFromBackPress){
        mIsCollapsedFromBackPress = false;
        super.onBackPressed();
     }
   }  

  @Override  
  public void onSlide(@NonNull View bottomSheet, float slideOffset) {  
     // React to dragging events  
  }  
});

而你的 backPressed() 方法应该像这样:

@Override
public void onBackPressed(){
    mIsCollapsedFromBackPress = true;
    mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
}

问题在于,底部表单被折叠的原因不是更改活动,而我不希望每次底部表单被折叠时活动都发生变化。 - Adam Katz
那么,在这种情况下,也许你可以使用一个本地的布尔变量,比如“mIsCollapsedOnBackPressed”,并在onBackPressed中将其设置为true,然后在BottomSheetBehavior的“if”语句中将其设置为false……这是我能想到的最快的解决方案。 - amilcar-sr
我刚刚编辑了答案,我认为它应该适用于你的情况 :) - amilcar-sr
1
谢谢,那个确实有用。我实际上做了一些不同的事情(但是受到你的回答启发),也可以工作,不确定哪个答案更好。我在onBackPressed中进行了回调,所以它只在按下返回按钮时才存在。 - Adam Katz
我该如何获取状态,比如我想查看是否显示了完整视图或用户需要向上滚动。这样,如果有更多的数据存在于当前视图之外,我就可以在底部显示更多信息按钮。 - andro
2
behavior.setBottomSheetCallback(); 已经过时。 - Alex Cuadrón

5
behavior.setBottomSheetCallback(); 

现在已经过时,请改用这个。

BottomSheetBehavior.from(nearbyBottomSheet).addBottomSheetCallback(object :BottomSheetBehavior.BottomSheetCallback() {
        override fun onStateChanged(bottomSheet: View, newState: Int) {

        }

        override fun onSlide(bottomSheet: View, slideOffset: Float) {
                
        }
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接