O valor da taxa de metade expandida deve ser definido como um valor entre 0 e 1 exclusivo ; portanto, defina esse valor para um número muito baixo, que certamente será menor que a sua altura de pico, diga "0,0001f". Com esse valor, você nem deve ver o STATE_HALF_EXPANDED
estado. Os estados variam entre STATE_EXPANDED
e STATE_COLLAPSED
.
Solução alternativa
A solução acima funciona e desativa efetivamente o STATE_HALF_EXPANDED
estado, mas é imprecisa (IMO) e pode ser interrompida no futuro. Por exemplo, e se for aplicado um valor razoável para a taxa de meia expansão, que esteja entre a altura da espiada e a altura total? Isso seria problema.
Os requisitos declarados pelo OP são que a folha inferior deve fazer a transição entre a altura da espiada e a altura total. Não há nenhum problema com a altura da espiada, mas o OP especifica isFitToContents = false
para atingir a altura total. (Presumo que a folha de baixo dele possa ser menor que o espaço disponível.)
Infelizmente, quando isFitToContents == false
é introduzido um comportamento adicional de "meia altura" que o OP deseja evitar e, portanto, a questão.
Além do comportamento de "meia altura", outro comportamento é introduzido, que é o "deslocamento expandido". O deslocamento expandido especifica a que distância da tela inteira a folha inferior será interrompida. Um valor de 100f
, por exemplo, deixará uma 100px
borda na parte superior da folha inferior quando totalmente expandida. O padrão para o deslocamento expandido é zero.
Não conheço nenhum comportamento que seja isFitToContents == false
introduzido além dos mencionados acima.
Portanto, considerando esses requisitos, podemos criar uma folha de fundo que se mova entre a altura da espiada e a altura total, especificando isFitToContents == true
assim evitando o problema da "meia altura"? Não há requisitos para um deslocamento expandido diferente de zero; portanto, não precisamos nos preocupar com isso.
Aqui está um pequeno aplicativo de demonstração demonstrando que podemos atender a esses requisitos com a estrutura da folha inferior direita:
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 tivermos uma folha inferior longa, a seguinte estrutura funcionará para rolá-la:
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>