我一直在尝试按照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
(正如您所注意到的,并没有向您提供有关您做错的任何信息。而是问题的症状)。
其他答案here或here要么难以理解,要么与问题密切相关,而无需太多解释。即使这样,我也尝试添加一个虚假的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}}
任何人都可以解释这些实际需要传递给他们的方法吗?
答案 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()
这将关闭所有打开的抽屉(通常只是那个)。