Android 不带动画的bottomSheetBehavior设置状态

Android 不带动画的bottomSheetBehavior设置状态,android,android-design-library,android-coordinatorlayout,bottom-sheet,Android,Android Design Library,Android Coordinatorlayout,Bottom Sheet,我用design library23.0.2尝试了新的bottomsheetbehavior,但我认为它太有限了。当我使用setState()方法更改状态时,底部页面使用ad动画移动到新状态 如何在没有动画的情况下立即更改状态?我没有看到一个公共方法可以做到这一点。不幸的是,看起来你不能。调用BottomSheetBehavior的setState以同步或异步调用开始设置动画(子对象、状态)结束。而且无法覆盖这些方法,因为setState是最终的,并且startSettingAnimation具

我用design library23.0.2尝试了新的
bottomsheetbehavior
,但我认为它太有限了。当我使用
setState()
方法更改状态时,底部页面使用ad动画移动到新状态


如何在没有动画的情况下立即更改状态?我没有看到一个公共方法可以做到这一点。

不幸的是,看起来你不能。调用
BottomSheetBehavior
setState
以同步或异步调用
开始设置动画(子对象、状态)
结束。而且无法覆盖这些方法,因为
setState
是最终的,并且
startSettingAnimation
具有包可见修改器。查看来源以了解更多信息


我也有同样的问题,但方式有点不同-在结算动画调用之前,我的UI状态将
sethidable
更改为false,因此我得到了
IllegalStateException
。我将考虑使用<代码> ButoSoeTeCalBeuts<代码>来正确地处理这个问题。

如果你真的需要它,那么你可以求助于反射:

  fun BottomSheetBehavior.getViewDragHelper(): ViewDragHelper? = BottomSheetBehavior::class.java
    .getDeclaredField("viewDragHelper")
    .apply { isAccessible = true }
    .let { field -> field.get(this) as? ViewDragHelper? }

  fun ViewDragHelper.getScroller(): OverScroller? = ViewDragHelper::class.java
    .getDeclaredField("mScroller")
    .apply { isAccessible = true }
    .let { field -> field.get(this) as? OverScroller? }
然后,当状态更改时,可以使用这些扩展方法:

  bottomSheetBehavior.setBottomSheetCallback(object : BottomSheetCallback() {
      override fun onSlide(view: View, offset: Float) {}

      override fun onStateChanged(view: View, state: Int) {
        if (state == STATE_SETTLING) {
           try { 
              bottomSheetBehavior.getViewDragHelper()?.getScroller()?.abortAnimation()
           } catch(e: Throwable) {}
        }
      }
    })

我要补充的是,代码并不完美,每次状态更改时获取字段的效率不高,这是为了简单起见。

如果要删除显示/关闭动画,可以使用
dialog.window?.setWindowAnimations(-1)
。例如:

class MyDialog(): BottomSheetDialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val dialog = super.onCreateDialog(savedInstanceState)

        dialog.window?.setDimAmount(0f) // for removing the dimm
        dialog.window?.setWindowAnimations(-1) // for removing the animation

        return dialog
    }
}

当我调用setState()以展开时,我会得到动画,但对于STATE_COLLAPSED,我不会得到它。这让我很困惑。Android issuetracker上的相应问题好吧,在他们添加它之前,这是有效的。