Der Wert des halb erweiterten Verhältnisses muss auf einen Wert zwischen 0 und 1 exklusiv eingestellt werden. Stellen Sie diesen Wert daher auf eine sehr niedrige Zahl ein, die mit Sicherheit unter Ihrer Blickhöhe liegt, z. B. "0,0001f". Mit diesem Wert sollten Sie nicht einmal den STATE_HALF_EXPANDED
Status sehen. Die Zustände schwanken zwischen STATE_EXPANDED
und STATE_COLLAPSED
.
Alternative Lösung
Die obige Lösung funktioniert und deaktiviert den STATE_HALF_EXPANDED
Status effektiv , ist jedoch hackisch (IMO) und kann in Zukunft nicht mehr funktionieren. Was ist zum Beispiel, wenn ein angemessener Wert für das halb erweiterte Verhältnis erzwungen wird, der irgendwo zwischen der Blickhöhe und der vollen Höhe liegt? Das wäre Ärger.
Die Anforderungen des OP lauten, dass das untere Blatt zwischen der Blickhöhe und der vollen Höhe wechseln muss. Es gibt kein Problem mit der Blickhöhe, aber das OP gibt anisFitToContents = false
an, dass die volle Höhe erreicht werden soll. (Ich gehe davon aus, dass sein unteres Blatt kürzer sein kann als der verfügbare Platz.)
Leider, wenn isFitToContents == false
ein zusätzliches "halbes" Verhalten eingeführt wird, das das OP vermeiden möchte und daher die Frage.
Zusätzlich zum Verhalten "halbe Höhe" wird ein anderes Verhalten eingeführt, nämlich der "erweiterte Versatz". Der erweiterte Versatz gibt an, wie weit vom unteren Bildschirm entfernt das untere Blatt angehalten wird. Ein Wert von100f
beispielsweise hinterlässt 100px
bei vollständiger Erweiterung einen Rand am oberen Rand des unteren Blattes. Der Standardwert für den erweiterten Offset ist Null.
Mir sind keine Verhaltensweisen bekannt isFitToContents == false
als die oben genannten bekannt.
Können wir angesichts dieser Anforderungen ein unteres Blatt erstellen, das sich beim Festlegen zwischen der Blickhöhe und der vollen Höhe bewegt? isFitToContents == true
wodurch das Problem der "halben Höhe" vermieden wird? Es ist kein erweiterter Offset ungleich Null erforderlich, daher müssen wir uns darüber keine Sorgen machen.
Hier ist eine kurze Demo-App, die zeigt, dass wir diese Anforderungen mit der rechten unteren Blattstruktur erfüllen können:
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>
Wenn wir ein langes unteres Blatt haben, funktioniert die folgende Struktur, um es zu scrollen:
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>