Nilai rasio setengah diperluas harus ditetapkan ke beberapa nilai antara 0 dan 1 eksklusif , jadi set nilai ini ke beberapa angka yang sangat rendah yang pasti kurang dari ketinggian mengintip Anda, katakan "0,0001f". Dengan nilai ini Anda bahkan tidak harus melihat STATE_HALF_EXPANDED
negara. Negara akan berfluktuasi antara STATE_EXPANDED
dan STATE_COLLAPSED
.
Solusi alternatif
Solusi di atas berfungsi dan secara efektif menonaktifkan STATE_HALF_EXPANDED
negara, tetapi itu adalah peretasan (IMO) dan mungkin pecah di masa depan. Misalnya, bagaimana jika nilai wajar untuk rasio setengah diperluas yang berada di suatu tempat antara ketinggian mengintip dan ketinggian penuh diberlakukan? Itu akan menjadi masalah.
Persyaratan sebagaimana dinyatakan oleh OP adalah bahwa lembaran bawah harus bertransisi antara ketinggian mengintip dan ketinggian penuh. Tidak ada masalah dengan ketinggian mengintip, tetapi OP menentukanisFitToContents = false
untuk mencapai ketinggian penuh. (Saya berasumsi bahwa lembaran bawahnya mungkin lebih pendek daripada ruang yang tersedia.)
Sayangnya kapan isFitToContents == false
perilaku "setengah tinggi" tambahan diperkenalkan bahwa OP ingin menghindari dan karena itu pertanyaannya.
Selain perilaku "setengah tinggi" perilaku lain diperkenalkan yang merupakan "diperluas offset." Offset yang diperluas menentukan seberapa jauh dari layar penuh lembar bawah akan berhenti. Nilai 100f
, misalnya, akan meninggalkan 100px
batas di bagian atas lembar bawah saat diperluas penuh. Default untuk offset yang diperluas adalah nol.
Saya tidak mengetahui adanya perilaku itu isFitToContents == false
memperkenalkan selain dari yang disebutkan di atas.
Jadi, mengingat persyaratan ini, dapatkah kita membuat lembaran bawah yang bergerak antara ketinggian mengintip dan ketinggian penuh saat menentukan isFitToContents == true
sehingga menghindari masalah "setengah tinggi"? Tidak ada persyaratan untuk offset yang diperluas tanpa nol, jadi kami tidak perlu khawatir tentang itu.
Berikut ini adalah aplikasi demo singkat yang menunjukkan bahwa kami dapat memenuhi persyaratan ini dengan struktur lembar kanan bawah:
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>
Jika kami memiliki lembar bawah yang panjang maka struktur berikut berfungsi untuk menggulirnya:
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>