Значение половины расширили отношение к должно быть установлено до некоторого значения между 0 и 1 эксклюзивными , поэтому установите это значение в какое - то очень низкое число, которое наверняка будут меньше , чем ваши прятки высоты, скажем , «0.0001f». С этим значением вы даже не должны видеть STATE_HALF_EXPANDED
состояние. Состояния будут колебаться между STATE_EXPANDED
и STATE_COLLAPSED
.
Альтернативное решение
Приведенное выше решение работает и эффективно отключает STATE_HALF_EXPANDED
состояние, но оно является хакерским (IMO) и может сломаться в будущем. Например, что, если будет применено разумное значение для половины расширенного отношения, которое находится где-то между высотой взгляда и полной высотой? Это было бы проблемой.
Требования, изложенные в OP, заключаются в том, что нижний лист должен переходить от высоты взгляда к полной высоте. С высотой взгляда проблем нет, но OP определяет, isFitToContents = false
как добраться до полной высоты. (Я предполагаю, что его нижний лист может быть короче, чем доступное пространство.)
К сожалению, когда isFitToContents == false
вводится дополнительное «половинное» поведение, которое ОП хочет избежать, и поэтому возникает вопрос.
В дополнение к поведению "половинной высоты" вводится другое поведение, которое является "расширенным смещением". Расширенное смещение указывает, насколько далеко вниз от полноэкранного режима остановится нижний лист. Значение 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>