Wartość pół rozwiniętego współczynnika musi być ustawiona na pewną wartość między 0 a 1 wyłączną , więc ustaw tę wartość na bardzo małą liczbę, która z pewnością będzie mniejsza niż wysokość podglądu, powiedz „0.0001f”. Przy tej wartości nie powinieneś nawet widzieć STATE_HALF_EXPANDED
stanu. Stany będą się zmieniać między STATE_EXPANDED
i STATE_COLLAPSED
.
Alternatywne rozwiązanie
Powyższe rozwiązanie działa i skutecznie wyłącza STATE_HALF_EXPANDED
stan, ale jest hackerskie (IMO) i może się złamać w przyszłości. Na przykład co się stanie, jeśli zostanie wymuszona rozsądna wartość dla połowy rozszerzonego stosunku, który jest gdzieś pomiędzy wysokością podglądu a pełną wysokością? To byłby problem.
Wymagania określone w PO są następujące: dolny arkusz powinien przechodzić między wysokością podglądu a pełną wysokością. Nie ma problemu z wysokością podglądu, ale OP określa, isFitToContents = false
aby dostać się na pełną wysokość. (Zakładam, że jego dolny arkusz może być krótszy niż dostępne miejsce).
Niestety, gdy isFitToContents == false
wprowadza się dodatkowe zachowanie „na pół wysokości”, którego PO chce uniknąć, a zatem pytanie.
Oprócz zachowania „połowy wysokości” wprowadza się inne zachowanie, które jest „rozszerzonym przesunięciem”. Rozszerzone przesunięcie określa, jak daleko od pełnego ekranu zatrzyma się dolny arkusz. Na przykład wartość 100f
, 100px
po pełnym rozwinięciu , pozostawi ramkę na górze dolnego arkusza. Wartość domyślna dla rozszerzonego przesunięcia wynosi zero.
Nie jestem świadomy żadnych zachowań, które isFitToContents == false
wprowadzają inne niż wymienione powyżej.
Zatem biorąc pod uwagę te wymagania, czy możemy zaprojektować dolny arkusz, który porusza się między wysokością rzutu a pełną wysokością, jednocześnie określając w isFitToContents == true
ten sposób uniknięcie problemu „połowy wysokości”? Nie ma wymagania dla niezerowego rozszerzonego przesunięcia, więc nie musimy się tym martwić.
Oto krótka aplikacja demonstracyjna pokazująca, że możemy spełnić te wymagania dzięki odpowiedniej strukturze dolnego arkusza:
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>
Jeśli mamy długi dolny arkusz, wówczas do przewijania działa następująca struktura:
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>