我有一个没有任何操作栏的导航栏(我不想要一个操作栏)。我正在尝试这样做,以便我有一个可以打开导航抽屉的按钮。
我知道DrawerLayout有一个名为openDrawer的方法 http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html#openDrawer(android.view.View)
我不知道如何使用它,但我在点击时尝试制作按钮,运行此方法:
DrawerLayout mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout);
mDrawerLayout.openDrawer(mDrawerLayout);
当我点击它时,它给了我一个Java NullPointerException。有人有任何想法吗?
编辑: 这段代码在片段中,我试图将这些抽屉布局引用到片段之外。我使用了调试器,它显示mDrawlerLayout为NULL。
有什么建议吗?
谢谢!
答案 0 :(得分:50)
它给你一个空指针,因为你试图在片段的视图中找到抽屉布局,当它实际上在活动视图中时。
快速破解你想做的事就是找到像这样的观点:
getActivity().findViewById(R.id.drawer_layout)
那应该有用。更好的方法是在打开抽屉的活动上有一个方法
public void openDrawer(){
mDrawerLayout.openDrawer(mDrawerLayout);
}
在onCreate活动中运行你的findViewById:
mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout);
mDrawerLayout应该是您活动的成员变量。
然后在你的片段中你可以打电话:
//cast activity to MyActivity so compiler doesn't complain
((MyActivity)getActivity()).openDrawer();
更好的方法是在片段中创建一个侦听器,并将该活动设置为片段的侦听器。然后你可以在活动上调用一个方法,类似于上面。我会让你做一些研究如何做到这一点。
答案 1 :(得分:34)
drawerLayout.openDrawer(Gravity.START);
答案 2 :(得分:2)
感谢@athor& @Ashish Tana。
我花了很多时间来弄清楚我得到的错误(NullPointerException
)。
我的工作方式;我使用getView()
而不是getActivity()
,而是通过mDrawerLayout.openDrawer(Gravity.LEFT);
打开抽屉。
mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
final ImageButton btnOpenDrawer = (ImageButton) getView().findViewById(R.id.drawer_menu);
btnOpenDrawer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDrawerLayout.openDrawer(Gravity.LEFT);
}
});
答案 3 :(得分:1)
我有一个更简单的解决方案,它使用DrawerLayout
中的isDrawerOpen()
。
下面的代码根据抽屉的当前状态(打开/关闭)来关闭或打开导航抽屉
Button hamMenu = findViewById(R.id.ham_menu);
hamMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DrawerLayout navDrawer = findViewById(R.id.drawer_layout);
// If navigation drawer is not open yet, open it else close it.
if(!navDrawer.isDrawerOpen(GravityCompat.START)) navDrawer.openDrawer(Gravity.START);
else navDrawer.closeDrawer(Gravity.END);
}
});
答案 4 :(得分:0)
我在这里写了一个答案:https://stackoverflow.com/a/18199771/880349
//For me a better way in avoiding a `null pointer` in getting the DrawerLayout
final DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//Opens the Drawer
drawer.openDrawer(Your View, Usually a ListView);
}
return false;
});
您直接在视图/片段中获取当前抽屉,以便您不会获得 NullPointerException
答案 5 :(得分:0)
适用于按钮点击
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
drawer.openDrawer(GravityCompat.START);
}
});
答案 6 :(得分:0)
Kotlin解决方案
如果要从片段中打开它,可以使用:
interface String {...}
或直接在活动内部:
activity?.drawerLayout?.openDrawer(GravityCompat.START)
注意:
如果您不熟悉'?',我强烈建议您从kotlin的文档中阅读有关null安全的信息(很简短,请不要担心):https://kotlinlang.org/docs/reference/null-safety.html