当前位置: 首页 > 知识库问答 >
问题:

设置Android导航抽屉的拖动边距

何聪
2023-03-14

我正在我的应用程序中使用新的导航抽屉。它很棒,除了我没有找到一种简单的方法来设置抽屉是如何打开的。默认行为是从屏幕的左边缘拖动打开。这很好,除非手机/桌子有一个外壳,并且手机的边缘不能被触摸。我想允许用户触摸并从屏幕的边缘向左拖动。这很容易与其他导航抽屉库(滑动库)一起设置。不幸的是,我没有看到谷歌的库有任何东西。

对于NavigationLayout,可以使用一个onTouchEvent()方法。当然,你可以听所有的触摸事件并触发openDrawer,但希望用更少的代码找到一种简单的方法。有什么想法吗?

共有2个答案

越健
2023-03-14

这是一个非常古老的问题,但我现在碰到了这个问题,我尝试了最初的解决方案,但它对我不起作用。

经过几个小时的尝试,我发现问题不在于解决方案。这是图书馆版本的变化。

接受的答案适用于android.drawerlayout:抽屉布局:1.0.0

但对我来说,我使用的是com.google.Android材质:材质:1.5.0,这取决于抽屉布局:抽屉布局的更高版本

Android团队在onLayout上添加了一些逻辑来设置边缘大小。

因此,我使用了原始解决方案,但没有在活动中使用它,而是基于抽屉布局创建了一个自定义视图。

所以这是我的自定义类:

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。它没有这个问题。

还要确保该解决方案仅适用于左侧/开始抽屉,而不是右侧/结束抽屉

谢志文
2023-03-14

在这里,我通过反射找到了一个解决方案

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
Field mDragger = mDrawerLayout.getClass().getDeclaredField(
        "mLeftDragger");//mRightDragger for right obviously
mDragger.setAccessible(true);
ViewDragHelper draggerObj = (ViewDragHelper) mDragger
        .get(mDrawerLayout);

Field mEdgeSize = draggerObj.getClass().getDeclaredField(
        "mEdgeSize");
mEdgeSize.setAccessible(true);
int edge = mEdgeSize.getInt(draggerObj);

mEdgeSize.setInt(draggerObj, edge * 5); //optimal value as for me, you may set any constant in dp
 类似资料:
  • 有可能吗? 更新:是的,使用工具栏小部件我看到边距。但我有另一个问题:这是白色的导航抽屉 但是当我使用 我看到黑色的背面图标 我可以以编程方式将后退按钮设为白色吗?或者仅使用自定义图标?

  • 我是android新手。我有一个关于Android导航抽屉的问题。我在我的应用程序中加入了导航抽屉,一切都很顺利,但我想知道是否有人能帮我在导航抽屉列表中获得惰性动画。 图像的来源。 非常感谢。

  • 有人能告诉我如何创建活动到这个主要活动,导航抽屉将看到在所有他们?我需要使用这个特定的MainActivity代码。我不需要使用碎片,只要3个简单的活动将添加到这个抽屉。 NavDrawer布局:

  • 我正在试用本教程中给出的导航抽屉(幻灯片菜单)。 上面的链接和我的不同之处在于,我试图调用活动而不是调用片段。当应用程序打开时,我无法看到导航抽屉菜单,我只能看到打开HOME活动的操作栏。 以下是我更改的代码:(是否需要一个片段,或者我可以在导航抽屉的第一个屏幕上使用活动?) 我如何解决这个问题,以便在我的家庭活动中显示导航抽屉? 更新: 我甚至尝试了以下链接中给出的选项: 如何使用导航抽屉调用我

  • 二等 三等

  • 问题内容: 有没有一种方法可以只配置一次导航抽屉,并在多个Activites上显示它? 问题答案: 为此,只需创建一个实现抽屉的BaseActivity类,然后让所有其他活动扩展该抽屉即可。