반 확장 비율의 값은 0과 1 독점 사이의 값으로 설정해야합니다 . 따라서이 값을 뾰족한 높이보다 작은 매우 낮은 숫자로 설정하십시오 (예 : "0.0001f"). 이 값을 사용하면 STATE_HALF_EXPANDED
상태를 볼 수도 없습니다 . 주 STATE_EXPANDED
와 사이에 변동이 STATE_COLLAPSED
있습니다.
대체 솔루션
위의 솔루션은 작동하고 효과적으로 STATE_HALF_EXPANDED
상태를 비활성화 하지만 해킹 (IMO)이며 향후 중단 될 수 있습니다. 예를 들어, 반 높이 비율과 전체 높이 사이에있는 절반 확장 비율에 대한 합리적인 값이 적용된다면 어떨까요? 문제가 될 것입니다.
OP에 명시된 바와 같이 요구 사항은 바닥 시트가 픽 높이와 전체 높이 사이에서 전환되어야한다는 것입니다. 엿보기 높이에는 문제가 없지만 OP isFitToContents = false
는 전체 높이에 도달하도록 지정 합니다. (나는 그의 바닥 시트가 사용 가능한 공간보다 짧을 수 있다고 가정합니다.)
불행하게도 isFitToContents == false
OP가 회피하고 싶어하는 추가 "반 높이"동작이 도입되면 질문이 생깁니다.
"반 높이"동작 외에도 "확장 오프셋"인 다른 동작이 도입되었습니다. 확장 오프셋은 바텀 시트가 전체 화면에서 얼마나 멀리 내려갈지를 지정합니다. 100f
예를 들어 값이 100px
완전히 확장되면 바텀 시트 상단에 테두리 가 남습니다 . 확장 된 오프셋의 기본값은 0입니다.
isFitToContents == false
위에서 언급 한 것 이외의 동작을 인식하지 못했습니다 .
따라서 이러한 요구 사항을 감안할 isFitToContents == true
때 "반 높이"문제를 피 하면서 특정 높이와 전체 높이 사이를 이동하는 바닥 시트를 만들 수 있습니까? 0이 아닌 확장 오프셋에 대한 요구 사항이 없으므로 걱정할 필요가 없습니다.
오른쪽 하단 시트 구조로 이러한 요구 사항을 충족 할 수 있음을 보여주는 간단한 데모 앱이 있습니다.
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>