42

我有一个没有任何操作栏的导航栏(我不想要操作栏)。我正在努力做到这一点,以便我有一个可以打开导航抽屉的按钮。

我知道 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。

有什么建议吗?

谢谢!

4

7 回答 7

56

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

做你想做的事的一个快速技巧是找到如下视图:

getActivity().findViewById(R.id.drawer_layout)

那应该行得通。更好的方法是在 Activity 上有一个方法来打开抽屉

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();

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

于 2013-07-23T23:17:34.117 回答
39
drawerLayout.openDrawer(Gravity.START);
于 2014-12-18T19:43:10.553 回答
3

它适用于按钮单击

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

            drawer.openDrawer(GravityCompat.START);

        }
    });
于 2016-11-06T11:46:36.977 回答
2

我有一个更简单的解决方案,它使用isDrawerOpen().DrawerLayout

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

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);
    }
});
于 2018-11-10T15:03:24.783 回答
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);
            }
        });
于 2017-01-25T11:17:30.967 回答
0

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

activity?.drawerLayout?.openDrawer(GravityCompat.START)

或直接在活动内部:

drawerLayout.openDrawer(GravityCompat.START)

注意:
如果您不熟悉“?”,我强烈建议您从 kotlin 的文档中阅读关于 null 安全的内容(它很短,不用担心):https://kotlinlang.org/docs/reference/null-safety。 html

于 2020-01-27T15:46:16.813 回答
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

于 2015-10-01T13:37:47.543 回答