这是一个非常古老的问题,但我最近遇到了这个问题。我尝试了原始解决方案,但它对我没有起作用。
经过数小时的尝试后,我发现问题不在解决方案上,而是由于库版本更改引起的。
被接受的答案适用于android.drawerlayout:drawerlayout:1.0.0
但对我而言,我使用的是com.google.android.material:material:1.5.0
,它依赖于drawerlayout:drawerlayout
的更高版本。
Android团队在onLayout
中添加了一些逻辑来设置边缘大小。
所以我使用了原始解决方案,但我没有在活动中使用它,而是基于DrawerLayout
创建了一个自定义视图。
这是我的自定义类:
class CustomDrawerLayout : DrawerLayout {
var swipeEdgeSize = 0
constructor(context: Context) : this(context, null, 0)
constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
super.onLayout(changed, l, t, r, b)
var leftDraggerField = DrawerLayout::class.java.getDeclaredField("mLeftDragger")
leftDraggerField.isAccessible = true
val viewDragHelper = leftDraggerField[this] as ViewDragHelper
val edgeSizeField = ViewDragHelper::class.java.getDeclaredField("mEdgeSize")
edgeSizeField.isAccessible = true
val origEdgeSize = edgeSizeField[viewDragHelper] as Int
edgeSizeField.setInt(viewDragHelper, max(swipeEdgeSize, origEdgeSize))
}
}
在这个活动中,我将使用类似这样的东西。
class MainActivity :....{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(....)
setSideMenuAreaRatio(0.8)
....
}
private fun setSideMenuAreaRatio(ration: Double) {
val displaySize = Point()
windowManager.defaultDisplay.getSize(displaySize)
binding.drawerLayout.swipeEdgeSize = (displaySize.x * ration).toInt()
}
}
如果你正在开始一个新项目,使用 jetpack compose
。它没有这个问题。
另外要确保该解决方案仅适用于左/开始抽屉而不是右/结束抽屉