半展开率的值必须设置为介于 0 和 1 之间的某个值不包含,因此请将此值设置为肯定小于窥视高度的某个非常低的数字,例如“0.0001f”。使用此值,您甚至应该看不到 STATE_HALF_EXPANDED 状态。状态将在STATE_EXPANDED 和STATE_COLLAPSED 之间波动。
替代解决方案
上述解决方案有效并有效地禁用了STATE_HALF_EXPANDED 状态,但它是hackish (IMO) 并且将来可能会中断。例如,如果强制执行介于窥视高度和全高之间的半展开率的合理值怎么办?那就麻烦了。
OP 规定的要求是底页应在窥视高度和全高之间过渡。窥视高度没有问题,但 OP 指定 isFitToContents = false 以达到全高。 (我假设他的底片可能比可用空间短。)
不幸的是,当isFitToContents == false 引入了额外的“半高”行为时,OP 希望避免并因此出现问题。
除了“半高”行为之外,还引入了另一种行为,即“扩展偏移”。扩展的偏移量指定底部工作表从全屏向下停止的距离。例如,100f 的值将在完全展开时在底部工作表的顶部留下一个 100px 边框。扩展偏移的默认值为零。
我不知道isFitToContents == false 引入的除上述行为之外的任何行为。
那么,考虑到这些要求,我们能否设计一个在窥视高度和全高之间移动的底片,同时指定isFitToContents == true 从而避免“半高”问题?不需要非零扩展偏移量,因此我们不必担心。
这是一个简短的演示应用程序,展示了我们可以通过右下方的表格结构满足这些要求:
MainActivity5.kt
class MainActivity5 : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main5)
val bottomSheet = findViewById<LinearLayout>(R.id.bottom_sheet)
val sheetBehavior: BottomSheetBehavior<LinearLayout> = BottomSheetBehavior.from(bottomSheet)
sheetBehavior.isFitToContents = true // the default
sheetBehavior.peekHeight = 200
// Log the states the bottom sheet passes through.
sheetBehavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
override fun onStateChanged(bottomSheet: View, newState: Int) {
Log.d("MainActivity", "<<<< $newState = ${translateSheetState(newState)}")
}
override fun onSlide(bottomSheet: View, slideOffset: Float) {}
})
}
}
BaseActivity.kt
open class BaseActivity : AppCompatActivity() {
protected fun translateSheetState(state: Int): String {
return when (state) {
BottomSheetBehavior.STATE_COLLAPSED -> "STATE_COLLAPSED"
BottomSheetBehavior.STATE_DRAGGING -> "STATE_DRAGGING"
BottomSheetBehavior.STATE_EXPANDED -> "STATE_EXPANDED"
BottomSheetBehavior.STATE_HALF_EXPANDED -> "STATE_HALF_EXPANDED"
BottomSheetBehavior.STATE_HIDDEN -> "STATE_HIDDEN"
BottomSheetBehavior.STATE_SETTLING -> "STATE_SETTLING"
else -> "Unknown state: $state"
}
}
}
activity_main5.xml
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:orientation="vertical"
android:scrollbars="none"
app:layout_behavior="@string/bottom_sheet_behavior">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="@string/short_text"
android:textSize="16sp" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
如果我们有一个长的底页,那么下面的结构可以滚动它:
activity_main6.xml
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:orientation="vertical"
android:scrollbars="none"
app:layout_behavior="@string/bottom_sheet_behavior">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="@string/long_text"
android:textSize="16sp" />
</androidx.core.widget.NestedScrollView>
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>