【问题标题】:How to open navigation drawer on button click in main fragment?如何在主片段中单击按钮时打开导航抽屉?
【发布时间】:2013-10-26 21:28:17
【问题描述】:

我制作了一个带有一个活动的应用程序,该活动使用导航抽屉打开许多不同的片段。我有操作栏抽屉切换,但它不是很明显。 如果我在我的主片段(我的应用首次启动时出现的片段)的 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);          

    }

感谢您的回答。

【问题讨论】:

    标签: android fragment navigation-drawer


    【解决方案1】:

    如果您需要打开幻灯片:

    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

    【讨论】:

    • 你可以考虑mDrawerLayout.isDrawerOpen(drawerView)而不是flag
    • 我想要这个布局在我的视野之上。在这种情况下,布局正在向一侧移动。我该怎么办?
    • 在您的 xml 中,默认情况下,最后(最底部)声明的视图将具有最高的 z-index(顶部),如果解决了问题,则应接受上述答案。
    • 一切正常,但不推荐使用setDrawerListener 必须使用addDrawerListener
    【解决方案2】:

    你应该使用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?只是想知道我是否遗漏了什么,因为在文档中重力用于识别抽屉。
    • @A.Harkous 我没有打开左侧抽屉并关闭右侧抽屉。我使用 Gravity.START 和 Gravity.END 的目的是,当单击同一个按钮时,如果抽屉未打开,它将被打开,否则如果抽屉已经打开,它将关闭。这服务于使用相同按钮根据导航抽屉的当前状态关闭或打开导航抽屉的目的。是的,使用 GravityCompat 是一个错字。修复它
    【解决方案3】:

    如果您在 android 中使用默认导航活动,您只需 将此代码添加到按钮的单击侦听器中--->

    mDrawerLayout.openDrawer(Gravity.START);
    

    关闭你不必做任何事情。

    【讨论】:

    • 这会导致汉堡菜单消失并被向上箭头取代。
    【解决方案4】:

    使用这些行在某个事件上打开和关闭抽屉:

    打开抽屉的代码sn-p:

    drawerLayout.openDrawer(Gravity.START);
    

    关闭抽屉的代码sn-p:

    drawerLayout.closeDrawer(Gravity.LEFT);
    

    openDrawer(gravity_of_navigation_view_to_be_shown)

    在 openDrawer("gravity") 中,在 "gravity" 部分,您必须像上面给出的那样输入 Navigation View 的重力:

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

    我认为这是最好的答案。

    【讨论】:

      【解决方案5】:

      要将工具栏应用为应用栏,首先确保您的活动从 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();
          }
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2020-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 2015-04-13
        • 1970-01-01
        相关资源
        最近更新 更多