Android 如何在没有操作栏的情况下打开导航抽屉,只需一个按钮即可打开

Android 如何在没有操作栏的情况下打开导航抽屉,只需一个按钮即可打开,android,button,navigation-drawer,drawerlayout,Android,Button,Navigation Drawer,Drawerlayout,我有一个没有任何actionbar的导航栏(我不想要actionbar)。我正在努力使它,以便我有一个按钮,可以打开导航抽屉 我知道有一种叫做openDrawer的方法用于抽屉布局 我不知道如何使用它,但我尝试在单击时制作一个按钮,运行此方法: DrawerLayout mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout); mDrawerLayout.openDrawer(mDrawerLayout

我有一个没有任何actionbar的导航栏(我不想要actionbar)。我正在努力使它,以便我有一个按钮,可以打开导航抽屉

我知道有一种叫做openDrawer的方法用于抽屉布局

我不知道如何使用它,但我尝试在单击时制作一个按钮,运行此方法:

DrawerLayout mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout);
mDrawerLayout.openDrawer(mDrawerLayout);
当我点击它时,它会给我一个Java NullPointerException。有人知道吗

编辑: 这段代码在片段内部,我试图引用片段外部的抽屉布局。我使用了调试器,它显示mDrawlerLayout为NULL

有什么建议吗


谢谢

它给您一个空指针,因为您试图在片段的视图中找到抽屉布局,而实际上它在活动视图中

一个快速的方法是找到如下视图:

getActivity().findViewById(R.id.drawer_layout)
这应该行得通。一个更好的方法是有一个打开抽屉的方法

public void openDrawer(){
    mDrawerLayout.openDrawer(mDrawerLayout);
}
在“创建”活动中,运行findViewById:

mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout);
mDrawerLayout应该是活动的成员变量

然后在片段中,您可以调用:

//cast activity to MyActivity so compiler doesn't complain
((MyActivity)getActivity()).openDrawer();

更好的方法是在片段中创建一个侦听器,并将活动设置为片段的侦听器。然后可以对活动调用一个方法,类似于上面所述。我会让你研究一下如何做到这一点。

我在这里写了一个答案:

drawerLayout.openDrawer(Gravity.START);

您可以直接在视图/框架中获取当前抽屉,这样您就不会得到NullPointerException,它可以在单击按钮时工作

mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            drawer.openDrawer(GravityCompat.START);

        }
    });

多亏了@athor&@ashishtana

我花了很多时间才弄清楚我遇到的错误(
NullPointerException

我的工作就是这样;我使用
getActivity()
而不是
getView()
,通过
mDrawerLayout.openDrawer(Gravity.LEFT)打开抽屉


我有一个更简单的解决方案,它使用了
DrawerLayout

下面的代码根据抽屉的当前状态(打开/关闭)关闭或打开导航抽屉


Kotlin解决方案
如果要从片段中打开它,可以使用:

activity?.drawerLayout?.openDrawer(GravityCompat.START)
或直接在活动内:

drawerLayout.openDrawer(GravityCompat.START)
注:

如果您不熟悉“?”,我强烈建议您阅读kotlin文档中有关null安全的内容(非常简短,不用担心):

我必须使用
mDrawerLayout.openDrawer(Gravity.LEFT)
in
openDrawer
方法使其工作。(我使用的导航抽屉没有碎片和操作栏)否则,它会挂起应用程序。是否可以删除默认图标?在那个位置,我想使用一个不同的选项菜单。这确实有效,我把这个onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);//把代码放在这里}
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);
    }
});
activity?.drawerLayout?.openDrawer(GravityCompat.START)
drawerLayout.openDrawer(GravityCompat.START)