Значення напіврозширеного коефіцієнта має бути встановлене на деяке значення між 0 і 1 виключно , тому встановіть це значення на дуже низьке число, яке, безумовно, буде меншим за вашу висоту підгляду, скажімо, "0,0001f". З цією цінністю ви навіть не повинні бачити STATE_HALF_EXPANDED
державу. Держави будуть коливатися між STATE_EXPANDED
та STATE_COLLAPSED
.
Альтернативне рішення
Вищенаведене рішення працює і ефективно відключає STATE_HALF_EXPANDED
стан, але воно є хакерським (ІМО) і може в майбутньому зламатися. Наприклад, що робити, якщо застосовується розумне значення для наполовину розгорнутого співвідношення, яке знаходиться десь між висотою підгляду та повною висотою? Це було б біда.
Вимоги, про які йдеться в ОП, полягають у тому, щоб нижній аркуш повинен був переходити між висотою погляду та повною висотою. Немає проблем із висотою підгляду, але ОП вказує 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>