简体   繁体   English

如何在主片段中单击按钮打开导航抽屉?

[英]How to open navigation drawer on button click in main fragment?

I have made an app with one activity which uses a navigation drawer to open a number of different fragments.我制作了一个带有一个活动的应用程序,该活动使用导航抽屉打开许多不同的片段。 I have the actionbar drawertoggle, but it is not very visible.我有 actionbar drawertoggle,但它不是很明显。 If I place a button in the onCreateView in my main fragment(the fragment that appears when my app first starts up), how can I get it to open the navigation drawer controlled by my activity?如果我在我的主要片段(我的应用程序首次启动时出现的片段)的 onCreateView 中放置一个按钮,我怎样才能让它打开由我的活动控制的导航抽屉?


This seems to work.这似乎有效。 The answer is much simpler than I thought it would be.答案比我想象的要简单得多。

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

    }

Thank you for your answers.谢谢您的回答。

if you need open the slide:如果您需要打开幻灯片:

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

if you need close the slide如果你需要关闭幻灯片

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

EXAMPLE例子

my mDrawerLayout is instanced here:我的 mDrawerLayout 在这里实例化:

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

my slide state:我的幻灯片状态:

mSlideState=false;

if you need to know the slide menu state (closed, opened).如果您需要知道滑动菜单状态(关闭、打开)。 Use this code:使用此代码:

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

finally.最后。 You can use your click event like this:您可以像这样使用点击事件:

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

In my case, my slide menu is at the right (Gravity.END), but if you need it on the left, try with Gravity.START就我而言,我的幻灯片菜单在右侧 (Gravity.END),但如果您需要在左侧,请尝试使用Gravity.START

You Should Use isDrawerOpen()你应该使用isDrawerOpen()

The piece of code below automatically closes or opens the navigation drawer based on the drawer's current state (Opened or Closed)下面的一段代码根据抽屉的当前状态(打开或关闭)自动关闭或打开导航抽屉

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

if you are using from default navigation activity in android you just have to add this code in click listener of button --->如果您在 android 中使用默认导航活动,则只需在按钮的单击侦听器中添加此代码 --->

mDrawerLayout.openDrawer(Gravity.START);

for closing you do not have to do something.关闭你不必做任何事情。

Use these lines to open and close the drawer on a certain event:使用这些行在特定事件中打开和关闭抽屉:

Code snippet for opening drawer:打开抽屉的代码片段:

drawerLayout.openDrawer(Gravity.START);

Code snippet for closing drawer:关闭抽屉的代码片段:

drawerLayout.closeDrawer(Gravity.LEFT);

openDrawer(gravity_of_navigation_view_to_be_shown) openDrawer(gravity_of_navigation_view_to_be_shown)

in openDrawer("gravity"), in "gravity" section, you have to input the gravity of the Navigation View like given above:在 openDrawer("gravity") 中,在 "gravity" 部分,您必须输入导航视图的重力,如上所示:

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

I think thats the best answer.我认为这是最好的答案。

To apply the toolbar as the app bar, first make sure your activity extends from AppCompatActivity.要将工具栏应用为应用栏,首先确保您的活动从 AppCompatActivity 扩展。 Then call setSupportActionBar() and pass the Toolbar object from your layout:然后调用 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();
    }
}

} }

Use the standard callback model as described here: 使用此处描述的标准回调模型:

http://developer.android.com/training/basics/fragments/communicating.html http://developer.android.com/training/basics/fragments/communicating.html

When you press the button, initiate a callback to the activity and have it open your drawer. 当您按下按钮时,启动对活动的回调并让它打开您的抽屉。

The simplest way in my opinion我认为最简单的方法

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM