Giá trị của tỷ lệ mở rộng một nửa phải được đặt thành một số giá trị từ 0 đến 1 độc quyền , do đó đặt giá trị này bằng một số rất thấp mà chắc chắn là ít hơn so với chiều cao cái nhìn của bạn, hãy nói "0.0001f". Với giá trị này, bạn thậm chí không nên nhìn thấy STATE_HALF_EXPANDED
trạng thái. Các tiểu bang sẽ dao động giữa STATE_EXPANDED
và STATE_COLLAPSED
.
Giải pháp thay thế
Giải pháp trên hoạt động và vô hiệu hóa STATE_HALF_EXPANDED
nhà nước một cách hiệu quả , nhưng nó là hackish (IMO) và có thể phá vỡ trong tương lai. Chẳng hạn, nếu một giá trị hợp lý cho tỷ lệ mở rộng một nửa nằm ở đâu đó giữa chiều cao nhìn trộm và chiều cao đầy đủ được thi hành thì sao? Đó sẽ là rắc rối.
Các yêu cầu như OP đã nêu là tấm dưới cùng phải chuyển đổi giữa chiều cao nhìn trộm và chiều cao đầy đủ. Không có vấn đề với chiều cao nhìn trộm, nhưng OP chỉ địnhisFitToContents = false
để có được chiều cao đầy đủ. (Tôi cho rằng tấm dưới cùng của anh ta có thể ngắn hơn không gian có sẵn.)
Thật không may, khi isFitToContents == false
một hành vi "nửa chiều cao" bổ sung được đưa ra mà OP muốn tránh và do đó là câu hỏi.
Ngoài hành vi "nửa chiều cao", một hành vi khác được đưa ra là "bù đắp mở rộng". Phần bù mở rộng chỉ định khoảng cách từ màn hình dưới cùng sẽ dừng bao xa. 100f
Ví dụ, một giá trị sẽ để lại một100px
đường viền ở trên cùng của bảng dưới cùng khi được mở rộng hoàn toàn. Mặc định cho phần bù mở rộng là zero.
Tôi không nhận thức được bất kỳ hành vi nào isFitToContents == false
giới thiệu ngoài những được đề cập ở trên.
Vì vậy, với những yêu cầu này, chúng ta có thể tạo một tấm dưới cùng di chuyển giữa chiều cao nhìn trộm và chiều cao đầy đủ trong khi chỉ định isFitToContents == true
do đó tránh được vấn đề "một nửa chiều cao" không? Không có yêu cầu cho phần bù mở rộng khác không, vì vậy chúng tôi không phải lo lắng về điều đó.
Dưới đây là một ứng dụng demo ngắn chứng minh rằng chúng ta có thể đáp ứng các yêu cầu này với cấu trúc bảng dưới cùng bên phải:
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>
Nếu chúng ta có một tấm dưới cùng dài thì cấu trúc sau hoạt động để cuộn nó:
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>