你需要传递给v4.widget.DrawerLayout.isDrawerOpen()/.openDrawer()/.closeDrawer()

Gra*_*eme 24 android navigation-drawer drawerlayout

我一直在试图跨越到移动我的代码DrawerLayout作为由Android建议这里SlidingDrawer已经过时了.

我的问题是,到目前为止DrawerLayout似乎要么执行得非常糟糕,有无用的错误消息(没有防御性编程)和/或在文档中没有得到足够的解释.

这个isDrawerOpen()方法在这里描述:

public boolean isDrawerOpen(查看抽屉)

检查给定的抽屉视图当前是否处于打开状态.为了被视为"开放",抽屉必须已经稳定在其完全可见的状态.要检查部分可见性,请使用isDrawerVisible(android.view.View).

参数:drawer - 要检查的抽屉视图

返回:如果给定的抽屉视图处于打开状态,则返回true

每个方法isDrawerOpen(View drawer),openDrawer(View drawer)并且closeDrawer(View drawer)在传递时不起作用:DrawerLayout有问题或者其中任何一个的孩子.我不知道我应该为这些方法提供什么来让它们发挥作用.有人能告诉我吗?

有关实现,请参阅下面的整个问题描述.

我有这样的布局:

<android.support.v4.widget.DrawerLayout
    android:id="@+id/mainmenuPanel"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/dualPane"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <FrameLayout
        android:id="@+id/menuPane"
        android:layout_width="300dp"
        android:layout_height="match_parent" />
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我将以下方法连接到一个按钮:

protected void onCreate(Bundle savedInstanceState) {    
    ...
    mMenuPanel = (DrawerLayout) findViewById(R.id.mainmenuPanel);
    ....
}

public boolean isDrawerOpen() {
    if(mMenuPanel != null) {
        return mMenuPanel.isDrawerOpen(mMenuPanel);
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您将其自身作为参数(在极端情况下会多余),则会出现以下错误:

E/AndroidRuntime(11241): java.lang.ClassCastException: 
android.widget.FrameLayout$LayoutParams cannot be cast to 
android.support.v4.widget.DrawerLayout$LayoutParams
Run Code Online (Sandbox Code Playgroud)

(正如你所注意到的那样,并没有给你任何关于你做错了什么的信息.而是问题的症状).

这里这里的其他答案要么难以理解,要么与问题密切相关,没有太多解释.即便如此,我还是尝试添加一个LinearLayout或一个DrawerLayout孩子,每个都给出了这个错误:

E/AndroidRuntime(11424): java.lang.IllegalArgumentException: 
View android.widget.FrameLayout{420f5ea8 V.E..... ........ 
0,0-800,1172 #7f060038 app:id/menuPane} is not a drawer
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这些方法实际需要传递给他们的工作吗?

Gra*_*eme 19

答案是:

第二个孩子(又名"抽屉")是需要传递给方法的东西.我的问题是,当我想到这一点时,我将布局简化为尽可能简单的实现测试 - 我从"抽屉"中移除了引力.如果没有重力,您将获得上述完全不相关的错误消息.

我可以确认我使用以下设置获得了代码:

mMenuPanel.isDrawerOpen(findViewById(R.id.drawer));
Run Code Online (Sandbox Code Playgroud)

并与布局:

<android.support.v4.widget.DrawerLayout
    android:id="@+id/mainmenuPanel"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <FrameLayout
        android:id="@+id/drawer"
        android:layout_width="300dp"
        android:layout_height="match_parent" 
        android:layout_gravity="start"/> <!-- This line was the problem!!!!!!!-->
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

  • 是.如果你看一下'DrawerLayout`的来源,那么`isDrawerOpen(...)`方法调用`isDrawer(...)`来检查它传递的`View`是一个抽屉.标准是检查`View`是否具有'Gravity.LEFT`或'Gravity.RIGHT`的`layout_gravity`."start"`lay​​out_gravity`是一个别名,可用于确定抽屉锚定的哪一侧.使用RTL(从右到左)语言,对于LTR语言,它将是"Gravity.RIGHT",它是"Gravity.LEFT".如果没有为`View`设置,`isDrawer(..)`方法返回false. (2认同)

Jos*_*hon 14

如果要避免引用视图或布局以调用isDrawerOpen,可以应用另一种方法.

在这种情况下,您必须指出重力:

mDrawerLayout.isDrawerOpen(Gravity.START);
Run Code Online (Sandbox Code Playgroud)

作为mDrawerLayout您DrawerLayout参考.

正如你所说,别忘了 android:layout_gravity="start"