android - Implement UP button action with Navigation Drawer
我正在使用Android Studio模板中的导航抽屉。我想在某些片段中使用"向上"按钮(箭头)来安装"汉堡包"按钮。
我使用
我使用此代码显示"向上"按钮箭头:
1 2 3 4 5 6 7 8 9 10 11 | public void UseUpButton(boolean value) { ActionBar actionBar = getSupportActionBar(); if (value) { actionBar.setDisplayHomeAsUpEnabled(false); toggle.setDrawerIndicatorEnabled(false); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowHomeEnabled(true); } else { toggle.setDrawerIndicatorEnabled(true); } } |
尝试过的变体:
但是我无法捕获单击此按钮的情况。我尝试了一些方法:
使用
1 2 3 4 5 6 7 8 9 10 11 12 | public boolean onOptionsItemSelected(MenuItem item) { Log.d("WTF","menu"); switch (item.getItemId()) { case android.R.id.home: getFragmentManager().popBackStack(); return true; default: return super.onOptionsItemSelected(item); } } |
我在
使用ActionBarToggle OnClickListener
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); toggle.setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); |
但是此方法也不会在按下向上按钮时调用。
结论:
那么,如何捕捉向上按钮按下事件?
几天前我在某个地方发现了这个...
在我的代码中,我初始化
1个
1 2 3 4 5 6 | public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, @StringRes int openDrawerContentDescRes, @StringRes int closeDrawerContentDescRes) { this(activity, null, drawerLayout, null, openDrawerContentDescRes, closeDrawerContentDescRes); } |
2
1 2 3 4 5 6 | public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, @StringRes int openDrawerContentDescRes, @StringRes int closeDrawerContentDescRes) { this(activity, toolbar, drawerLayout, null, openDrawerContentDescRes, closeDrawerContentDescRes); } |
看看:第二个构造函数具有
如果要处理
示例:
1 2 3 4 5 6 7 | toggle = new ActionBarDrawerToggle( this, drawer, R.string.navigation_drawer_open, R.string.navigation_drawer_close); getSupportActionBar().setHomeButtonEnabled(true); |
我在您的方法中添加了几行,以便实现后退按钮:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public void useUpButton(boolean value) { ActionBar actionBar = getSupportActionBar(); if (value) { actionBar.setDisplayHomeAsUpEnabled(false); toggle.setDrawerIndicatorEnabled(false); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowHomeEnabled(true); toggle.setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); } else { toggle.setDrawerIndicatorEnabled(true); toggle.setToolbarNavigationClickListener(null); } } |
对于使汉堡包按钮打开抽屉的默认行为,您只能使用此代码
1 2 3 4 5 6 7 8 | Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle mActionBarDrawerToggle = new ActionBarDrawerToggle( this, drawer, mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(mActionBarDrawerToggle); mActionBarDrawerToggle.syncState(); |
然后在任何子活动中覆盖默认行为,请执行此操作
1 2 3 4 5 6 7 8 9 10 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); // shows the up navigation button instead of the hamburger mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); //end current activity } }); |
当ActionBarDrawerToggle将工具栏作为输入时,它将在工具栏上设置自己的NavigationOnClickListener。当单击向上按钮时,我们可以重写此代码以调用我们的代码。
希望它会帮助您...
1 2 3 4 5 6 7 | DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);//for fragment if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { //do samething } } |
或使用此
1 2 3 4 5 6 7 8 9 | @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);//for fragment if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { finish(); } } |
嗨,如果您想拦截操作栏项目,请首先从片段中单击,然后首先将其添加到onCreate片段中:
1 | setHasOptionsMenu(true); |
仅使用正确的方法onOptionsItemSelected(在活动中使用时,片段版本不同):
1 2 3 4 5 6 7 8 9 | @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.your_action: //do something return true; default: return super.onOptionsItemSelected(item); } }//onOptionsItemSelected |