Yarım genişletilmiş oranının değeri 0 ile 1 arasında bazı değere ayarlanması gerekir münhasır az sizin gözetleme yükseklikten daha olması kesindir bazı çok az sayıda bu değeri ayarlamak yüzden, "0.0001f" derler. Bu değerle STATE_HALF_EXPANDED
durumu bile görmemelisiniz . Devletler STATE_EXPANDED
ve arasında dalgalanacaktır STATE_COLLAPSED
.
Alternatif çözüm
Yukarıdaki çözüm STATE_HALF_EXPANDED
devleti işler ve etkili bir şekilde devre dışı bırakır , ancak hackish (IMO) ve gelecekte kırılabilir. Örneğin, göz yüksekliği ile tam yükseklik arasında bir yerde bulunan yarı genişletilmiş oran için makul bir değer uygulanırsa ne olur? Bu bela olur.
OP tarafından belirtilen şartlar, alt tabakanın göz yüksekliği ile tam yükseklik arasında geçiş yapmasıdır. Peek yüksekliği ile ilgili bir sorun yoktur, ancak OP isFitToContents = false
tam yüksekliğe ulaşmayı belirtir . (Alt tabakasının kullanılabilir alandan daha kısa olabileceğini varsayıyorum.)
Ne yazık ki, isFitToContents == false
OP'nin kaçınmak istediği ek bir "yarı yükseklik" davranışı ve dolayısıyla soru sorulduğunda.
"Yarım yükseklik" davranışına ek olarak, "genişletilmiş ofset" olan başka bir davranış ortaya çıkar. Genişletilmiş ofset, alt sayfanın tam ekrandan ne kadar aşağı duracağını belirtir. 100f
Örneğin değeri, 100px
tamamen genişletildiğinde alt sayfanın üstünde bir kenarlık bırakacaktır . Genişletilmiş ofset için varsayılan değer sıfırdır.
isFitToContents == false
Yukarıda belirtilenler dışında ortaya çıkan davranışların farkında değilim .
Peki, bu gereksinimler göz isFitToContents == true
önüne alındığında, "yarım yükseklik" probleminden kaçınarak, göz yüksekliği ve tam yükseklik arasında hareket eden bir alt tabaka oluşturabilir miyiz ? Sıfır olmayan bir genişletilmiş ofset için herhangi bir gereklilik yoktur, bu yüzden bunun için endişelenmemiz gerekmez.
İşte sağ alt sayfa yapısıyla bu gereksinimleri karşılayabileceğimizi gösteren kısa bir demo uygulaması:
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>
Uzun bir alt tabakamız varsa, aşağıdaki yapı sayfayı kaydırmak için çalışır:
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>