ค่าของอัตราส่วนที่ขยายครึ่งจะต้องถูกตั้งค่าเป็นค่าระหว่าง 0 และ 1 เอกสิทธิ์ดังนั้นให้ตั้งค่านี้เป็นจำนวนที่ต่ำมากซึ่งแน่นอนว่าจะน้อยกว่าความสูงที่แอบมองของคุณพูดว่า "0.0001f" ด้วยค่านี้คุณไม่ควรเห็นแม้แต่STATE_HALF_EXPANDED
สถานะ รัฐจะมีความผันผวนระหว่างและSTATE_EXPANDED
STATE_COLLAPSED
ทางเลือกอื่น
วิธีการแก้ปัญหาข้างต้นใช้งานได้และปิดการใช้งานอย่างมีประสิทธิภาพของSTATE_HALF_EXPANDED
รัฐ แต่เป็นการแฮ็ก (IMO) และอาจแตกในอนาคต ตัวอย่างเช่นจะเกิดอะไรขึ้นหากค่าที่เหมาะสมสำหรับอัตราส่วนที่ขยายครึ่งซึ่งอยู่ระหว่างความสูงที่แอบดูและความสูงเต็มจะถูกบังคับใช้ นั่นจะเป็นปัญหา
ข้อกำหนดตามที่ระบุไว้โดย OP คือแผ่นด้านล่างควรเปลี่ยนระหว่างความสูงแอบมองและความสูงเต็ม ไม่มีปัญหากับความสูงแอบมอง แต่ OP ระบุisFitToContents = false
เพื่อให้ได้ความสูงเต็ม (ฉันสมมติว่าแผ่นด้านล่างของเขาอาจจะสั้นกว่าพื้นที่ว่าง)
น่าเสียดายที่เมื่อisFitToContents == false
มีการแนะนำพฤติกรรม "ครึ่งความสูง" เพิ่มเติมว่า OP ต้องการหลีกเลี่ยงและดังนั้นจึงเป็นคำถาม
นอกจากพฤติกรรม "half-height" แล้วยังมีการแนะนำพฤติกรรมอื่นซึ่งก็คือ "offset offset" ออฟเซ็ตที่ขยายจะระบุระยะที่แผ่นด้านล่างสุดเต็มจอจะหยุดลง 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>