半分の拡大比の値は、0と1の間にいくつかの値に設定する必要があります排他的なので、あまり自分のPEEK高さよりも「0.0001f」と言うことは確かであるいくつかの非常に低い数値にこの値を設定し、。この値では、STATE_HALF_EXPANDED
状態を見ることさえできません。州はとの間STATE_EXPANDED
で変動しSTATE_COLLAPSED
ます。
代替ソリューション
上記の解決策は機能し、事実上STATE_HALF_EXPANDED
状態を無効にしますが、ハック(IMO)であり、将来は機能しなくなる可能性があります。たとえば、ピークの高さと完全な高さの間のどこかにある半分に拡大された比率に適切な値が適用されている場合はどうなりますか?それは問題だろう。
OPで述べられている要件は、ボトムシートがピークの高さとフルの高さの間で移行することです。ピークの高さには問題はありませんが、OP isFitToContents = false
は完全な高さに到達するように指定しています。(私は彼のボトムシートが利用可能なスペースよりも短いかもしれないと思います。)
残念ながら、isFitToContents == false
追加の「ハーフハイト」動作が導入された場合、OPは回避したいと考えているため、問題が発生します。
「ハーフハイト」動作に加えて、「拡張オフセット」という別の動作が導入されています。展開されたオフセットは、下部シートがフルスクリーンからどれだけ下に停止するかを指定します。100f
たとえば、の値は、100px
完全に展開したときに下のシートの上部に境界線を残します。拡張オフセットのデフォルトはゼロです。
isFitToContents == false
上記以外の行動を起こすことは知りません。
したがって、これらの要件を前提として、ピークの高さと完全な高さの間を移動するボトムシートを指定isFitToContents == true
して、「ハーフハイト」の問題を回避しながら指定できますか?ゼロ以外の拡張オフセットの要件はないので、それについて心配する必要はありません。
以下は、右下のシート構造でこれらの要件を満たすことができることを示す短いデモアプリです。
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>
下部のシートが長い場合は、次の構造でスクロールします。
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>