如何在主要片段中的按钮点击上打开导航抽屉?

27

我已经制作了一个应用程序,其中包括一个活动(activity),该活动使用导航抽屉来打开许多不同的片段(fragment)。我有操作栏抽屉切换(drawertoggle),但它不是很明显。 如果我在我的主要片段(onCreateView)中放置一个按钮(该片段在我的应用程序启动时首先出现),我如何才能让它打开由我的活动控制的导航抽屉?


这似乎有效。答案比我想象的简单得多。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View fragView = inflater.inflate(R.layout.mainmenu, container, false);
    button1 = (Button) fragView.findViewById(R.id.button1);         
    mDrawerLayout = (DrawerLayout)getActivity().findViewById(R.id.drawer_layout);
    mDrawerList = (ListView)getActivity().findViewById(R.id.left_drawer);
    button1.setOnClickListener(this);
    return fragView;
}


@Override
public void onClick(View v) {       

        mDrawerLayout.openDrawer(mDrawerList);          

    }

谢谢您的回答。

6个回答

77

如果您需要打开幻灯片:

mDrawerLayout.openDrawer(Gravity.LEFT); //Edit Gravity.START need API 14

如果你需要关闭幻灯片

mDrawerLayout.closeDrawer(Gravity.LEFT); //Edit Gravity.START need API 14

例子

这里实例化了我的mDrawerLayout:

mDrawerLayout = (DrawerLayout)findViewById(R.id.my_drawer_layout);

我的幻灯片状态:

mSlideState=false;

如果您需要知道滑动菜单的状态(关闭、打开),请使用此代码:

mDrawerLayout.setDrawerListener(new ActionBarDrawerToggle(this, 
    mDrawerLayout, 
    R.drawable.ic_menu_slide,
    0,
    0){
@Override
public void onDrawerClosed(View drawerView) {                       
    super.onDrawerClosed(drawerView);
    mSlideState=false;//is Closed
}
@Override
public void onDrawerOpened(View drawerView) {                       
    super.onDrawerOpened(drawerView);
    mSlideState=true;//is Opened
}});

最后,您可以像这样使用您的点击事件:

public void clickEventSlide(){
if(mSlideState){                
    mDrawerLayout.closeDrawer(Gravity.END);
}else{              
    mDrawerLayout.openDrawer(Gravity.END);
}}

在我的情况下,我的滑动菜单在右侧(Gravity.END),但如果您需要它出现在左侧,请尝试使用 Gravity.START


5
建议您考虑使用mDrawerLayout.isDrawerOpen(drawerView)而非标志变量。 - Rowan
我想在我的视图上方放置这个布局。但是这个布局会移动到一侧。我该怎么办? - DKV
在你的XML里,最后(底部)声明的视图默认会有最高的Z轴值(即位于最上层)。如果上述答案解决了问题,则应该接受它。 - Talha
一切都运行良好,但 setDrawerListener 已被弃用,必须使用 addDrawerListener - MeLean

21

你应该使用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 the navigation drawer is not open then open it, if its already open then close it.
        if(!navDrawer.isDrawerOpen(Gravity.START)) navDrawer.openDrawer(Gravity.START);
        else navDrawer.closeDrawer(Gravity.END);
    }
});

你是打开左边的抽屉并关闭右边的吗?否则为什么第一行使用gravity.start而第二行使用gravity.end?还有,为什么要同时使用GravityCompat和Gravity?只是想知道是否我漏掉了什么,因为在文档中gravity用于识别抽屉。 - A. Harkous
@A.Harkous 我不是打开左边的抽屉然后关闭右边的。我使用Gravity.START和Gravity.END,目的是当单击相同的按钮时,如果抽屉没有打开,它将被打开,否则,如果抽屉已经打开,则会关闭。这有助于利用相同的按钮根据其当前状态关闭或打开导航抽屉。而且,使用GravityCompat是一个笔误。已经修复了。 - Sapnesh Naik

4

如果你正在使用 Android 中的默认导航活动,你只需要在按钮的单击监听器中添加以下代码 --->

mDrawerLayout.openDrawer(Gravity.START);

关闭时,您不需要做任何操作。


1
这会导致汉堡菜单消失,并被向上箭头所取代。 - Johann

4

使用以下代码在特定事件中打开和关闭抽屉:

打开抽屉的代码片段:

drawerLayout.openDrawer(Gravity.START);

关闭抽屉的代码片段:

drawerLayout.closeDrawer(Gravity.LEFT);

openDrawer(需要显示的导航视图的引力方向)

在 openDrawer("引力方向") 中,您需要像上面提供的示例一样输入导航视图的引力方向:

Gravity.LEFT
Gravity.RIGHT
Gravity.START
Gravity.END

我认为那是最好的答案。

3

要将工具栏应用为应用栏,首先确保您的活动扩展自AppCompatActivity。然后调用setSupportActionBar()并传递来自您布局的Toolbar对象:

    toolbar=(Toolbar) findViewById(R.id.toolbar_main);
    setSupportActionBar(toolbar);
    ActionBar actionbar = getSupportActionBar();
    actionbar.setDisplayHomeAsUpEnabled(true);
    actionbar.setHomeAsUpIndicator(R.drawable.ic_menu_black_24dp);

    drawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle actionBarDrawerToggle=new ActionBarDrawerToggle(this,drawerLayout,R.string.navigation_drawer_open,
            R.string.navigation_drawer_close);
    drawerLayout.addDrawerListener(actionBarDrawerToggle);
    actionBarDrawerToggle.syncState();

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            drawerLayout.openDrawer(GravityCompat.START);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    if (drawerLayout.isDrawerOpen(GravityCompat.START)){
        drawerLayout.closeDrawer(GravityCompat.START);
    }
    else{
        super.onBackPressed();
    }
}

}


0

在我看来,最简单的方法是

   @Override
    public void onBackPressed() {
        if(mDrawerLayout.isDrawerOpen(findViewById(R.id.navigationViewId))){
            mDrawerLayout.closeDrawer(Gravity.LEFT);
        }else
        super.onBackPressed();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接