为啥我不能用布局重力锁定 DrawerLayout

Posted

技术标签:

【中文标题】为啥我不能用布局重力锁定 DrawerLayout【英文标题】:Why i can't lock DrawerLayout with layout gravity为什么我不能用布局重力锁定 DrawerLayout 【发布时间】:2013-08-27 02:41:39 【问题描述】:

我使用DrawerLayout,最近我想改变drawerLayout 中listView 的重力。但是在我将listView的重力从android:layout_gravity="start"更改为android:layout_gravity="start|bottom"后,drawerLayout不能锁定到

mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

setDrawerLockMode() 使用;

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_
android:layout_ >

<RelativeLayout
    android:layout_
    android:layout_ >
</RelativeLayout>

<ListView
    android:id="@+id/drawer_list"
    android:layout_
    android:layout_
    android:layout_gravity="start"
    android:background="#F3F3F4"
    android:choiceMode="singleChoice" >
</ListView>

但它不锁定;

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_
android:layout_ >

<RelativeLayout
    android:layout_
    android:layout_ >
</RelativeLayout>

<ListView
    android:id="@+id/drawer_list"
    android:layout_
    android:layout_
    android:layout_gravity="start|bottom"
    android:background="#F3F3F4"
    android:choiceMode="singleChoice" >
</ListView>

`

任何关于为什么我不能在其他重力下使用锁定模式的线索?

谢谢!

【问题讨论】:

另外,为了处理重力,请在此处检查我的答案:***.com/a/50304856/2873702 【参考方案1】:

基于documentation,可以使用的唯一重力是Gravity.LEFTGravity.RIGHTGravityCompat.STARTGravityCompat.END

(强调我的):

抽屉的定位和布局由 子视图上的 android:layout_gravity 属性对应于哪个 您希望抽屉出现的视图一侧:leftright。 (或者在支持布局方向的平台版本上开始/结束。)

看着source code

public void setDrawerLockMode(int lockMode, int edgeGravity) 
  final int absGrav = GravityCompat.getAbsoluteGravity(edgeGravity,
                                                       ViewCompat.getLayoutDirection(this));
  if (absGrav == Gravity.LEFT) 
    mLockModeLeft = lockMode;
   else if (absGrav == Gravity.RIGHT) 
    mLockModeRight = lockMode;
  
  if (lockMode != LOCK_MODE_UNLOCKED) 
    // Cancel interaction in progress
    final ViewDragHelper helper = absGrav == Gravity.LEFT ? mLeftDragger : mRightDragger;
    helper.cancel();
  
  switch (lockMode) 
    case LOCK_MODE_LOCKED_OPEN:
      final View toOpen = findDrawerWithGravity(absGrav);
      if (toOpen != null) 
        openDrawer(toOpen);
      
      break;
    case LOCK_MODE_LOCKED_CLOSED:
      final View toClose = findDrawerWithGravity(absGrav);
      if (toClose != null) 
        closeDrawer(toClose);
      
      break;
      // default: do nothing
  

该方法本身仅检查重力是LEFT 还是RIGHT(但使用GravityCompat 方法,因此STARTEND 应适当翻译)。

这意味着通过设置"start|bottom" 的重力,您将引入无效的重力,这会导致setDrawerLockMode() 什么都不做。

【讨论】:

谢谢。我已经解决了这个问题,将列表视图添加到另一个布局中。但是这段代码解释了我的问题。 不客气!恭喜您找到了您想要实现的替代方案:-) 正确答案,但他们也应该支持ENDSTART

以上是关于为啥我不能用布局重力锁定 DrawerLayout的主要内容,如果未能解决你的问题,请参考以下文章

用altium designer 画图,布局时元件不能拖动怎么解决

Swift UIImage 不能用重力动画

php 重力特权//锁定//简单锁定系统以防止并发操作

安卓笔记:DrawerLayout抽屉布局的使用

安卓笔记抽屉式布局----DrawerLayout

DrawerLayout—侧拉栏的使用