Il valore del rapporto semi-espanso deve essere impostato su un valore compreso tra 0 e 1 esclusivo , quindi impostare questo valore su un numero molto basso che sarà sicuramente inferiore all'altezza di sbircia, ad esempio "0.0001f". Con questo valore non dovresti nemmeno vedere lo STATE_HALF_EXPANDED
stato. Gli stati oscilleranno tra STATE_EXPANDED
e STATE_COLLAPSED
.
Soluzione alternativa
La soluzione sopra funziona e disabilita efficacemente lo STATE_HALF_EXPANDED
stato, ma è un hacker (IMO) e potrebbe rompersi in futuro. Ad esempio, cosa succede se viene applicato un valore ragionevole per il rapporto semi-espanso che si trova tra l'altezza di sbirciata e l'altezza completa? Sarebbe un problema.
I requisiti stabiliti dall'OP sono che il foglio inferiore deve passare tra l'altezza di sbirciata e l'altezza completa. Non ci sono problemi con l'altezza di sbirciatina, ma l'OP specifica isFitToContents = false
di arrivare alla massima altezza. (Suppongo che il suo foglio inferiore possa essere più corto dello spazio disponibile.)
Sfortunatamente, quando isFitToContents == false
viene introdotto un ulteriore comportamento a "mezza altezza" che l'OP vuole evitare e quindi la domanda.
Oltre al comportamento a "mezza altezza", viene introdotto un altro comportamento che è l '"offset esteso". L'offset espanso specifica fino a che punto si arresta il foglio inferiore rispetto allo schermo intero. Un valore 100f
, ad esempio, lascerà un 100px
bordo nella parte superiore del foglio inferiore una volta espanso completamente. L'impostazione predefinita per l'offset espanso è zero.
Non sono a conoscenza di comportamenti che isFitToContents == false
introducano diversi da quelli sopra menzionati.
Quindi, dati questi requisiti, possiamo modellare un foglio inferiore che si sposta tra l'altezza di sbirciata e l'altezza completa specificando isFitToContents == true
così evitando il problema della "mezza altezza"? Non è richiesto un offset espanso diverso da zero, quindi non dobbiamo preoccuparci di questo.
Ecco una breve app demo che dimostra che possiamo soddisfare questi requisiti con la giusta struttura in basso:
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>
Se abbiamo un foglio inferiore lungo, la seguente struttura funziona per farlo scorrere:
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>