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

时间:2013-07-23 21:39:24

标签: android button navigation-drawer drawerlayout

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

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

有什么建议吗?

谢谢!

7 个答案:

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