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

时间:2013-11-29 15:52:13

标签: android navigation-drawer drawerlayout

我一直在尝试按照DrawerLayout的建议将我的代码移到SlidingDrawer,因为DrawerLayout已被弃用。

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

isDrawerOpen(View drawer)方法描述为here

  

public boolean isDrawerOpen(查看抽屉)

     

检查给定的抽屉视图当前是否处于打开状态。成为   被认为是“开放”的抽屉必须已经安定下来,完全可见   州。检查部分可见性使用情况   isDrawerVisible(android.view.View)。

     

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

     

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

每个方法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> 或其中任何一个孩子。我不知道我应该为这些方法提供什么来让它们发挥作用。有人可以告诉我吗?

请参阅下文,了解有关实施的完整问题说明。

我有这样的布局:

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

public boolean isDrawerOpen() {
    if(mMenuPanel != null) {
        return mMenuPanel.isDrawerOpen(mMenuPanel);
    }
    return false;
}

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

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

但是如果你把它自己作为一个参数(在极端情况下会是多余的)你会得到以下错误:

LinearLayout

(正如您所注意到的,并没有向您提供有关您做错的任何信息。而是问题的症状)。

其他答案herehere要么难以理解,要么与问题密切相关,而无需太多解释。即使这样,我也尝试添加一个虚假的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 的孩子,每个都给出这个错误:

{{1}}

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

4 个答案:

答案 0 :(得分:19)

答案是:

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

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

mMenuPanel.isDrawerOpen(findViewById(R.id.drawer));

并使用布局:

<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>

答案 1 :(得分:14)

如果您想避免引用视图或布局以调用 isDrawerOpen ,则可以应用其他方法。

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

mDrawerLayout.isDrawerOpen(Gravity.START);

mDrawerLayout 对DrawerLayout的引用。

如你所说,不要忘记android:layout_gravity="start"

答案 2 :(得分:2)

如果您对DrawerLayout有引用,并且在本例中是带有ID为R.id.menuPane的FrameLayout,则在您的Activity中也可以执行...

DrawerLayout mMenuPanel = (DrawerLayout) findViewById(R.id.mainmenuPanel);
FrameLayout mMenuPane = (FrameLayout) findViewById(R.id.menuPane);
mMenuPanel.isDrawerOpen(mMenuPane);

基本上你必须传递对DrawerLayout中用作抽屉的视图的引用,无论如何它总是为mMenuPanel.getChildAt(1)。

答案 3 :(得分:-1)

如果您正在使用支持库中的抽屉布局,我们可以从您的问题中看到,您还可以使用以下方法:

closeDrawers()

这将关闭所有打开的抽屉(通常只是那个)。