android - 使用导航抽屉实现向上按钮操作
android - Implement UP button action with Navigation Drawer
问题
我正在使用 Android Studio 模板中的导航抽屉。我想在我的一些片段中使用 UP 按钮(箭头) instend "Hamburger" 按钮。
我用 AppCompatActivity
.
我使用此代码显示向上按钮箭头:
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);
}
}
尝试过的变体:
但是我无法点击这个按钮。我尝试了一些方法:
使用onOptionsItemSelected
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);
}
}
我将 getSupportActionBar().setHomeButtonEnabled(true);
添加到我的 Activity::onCreate
,但是当我按下向上按钮时 onOptionsItemSelected
没有被调用,当我按下菜单项时它可以正常工作。
使用 ActionBarToggle OnClickListener
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) {
}
});
但此方法也不会在按下向上按钮时调用。
结论:
那么,如何捕捉向上按钮按下事件?
你好如果你想拦截操作栏项目点击你需要首先将它添加到你的片段 onCreate:
setHasOptionsMenu(true);
只使用正确的 onOptionsItemSelected 方法(在 activity 中使用时片段版本不同):
@Override public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.your_action:
//do something
return true;
default:
return super.onOptionsItemSelected(item);
}
}//onOptionsItemSelected
希望对您有所帮助...
DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);//for fragment
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
//do samething
}
}
或使用这个
@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();
}
}
几天前我在某处发现了这个...
在我的代码中,我初始化了 ActionBarDrawerToggle
。它有一些构造函数,但我对此感兴趣:
1
public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,
@StringRes int openDrawerContentDescRes,
@StringRes int closeDrawerContentDescRes) {
this(activity, null, drawerLayout, null, openDrawerContentDescRes,
closeDrawerContentDescRes);
}
2
public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,
Toolbar toolbar, @StringRes int openDrawerContentDescRes,
@StringRes int closeDrawerContentDescRes) {
this(activity, toolbar, drawerLayout, null, openDrawerContentDescRes,
closeDrawerContentDescRes);
}
看看:第二个构造函数有Toolbar toolbar
个参数。
如果你想处理 UP BUTTON
事件 不要使用第二个构造函数,先使用。
示例:
toggle = new ActionBarDrawerToggle(
this,
drawer,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
getSupportActionBar().setHomeButtonEnabled(true);
setHomeButtonEnabled
很重要,没有这个你将看不到 Hamburger 或 Up 按钮。
对于使汉堡包按钮打开抽屉的默认行为,您可以使用此代码
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();
然后要覆盖任何子 activity 中的默认行为,请执行此操作
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。我们可以覆盖它以在单击向上按钮时调用我们的代码。
我在您的方法中添加了几行,以便实现后退按钮:
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);
}
}
问题
我正在使用 Android Studio 模板中的导航抽屉。我想在我的一些片段中使用 UP 按钮(箭头) instend "Hamburger" 按钮。
我用 AppCompatActivity
.
我使用此代码显示向上按钮箭头:
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);
}
}
尝试过的变体:
但是我无法点击这个按钮。我尝试了一些方法:
使用onOptionsItemSelected
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);
}
}
我将 getSupportActionBar().setHomeButtonEnabled(true);
添加到我的 Activity::onCreate
,但是当我按下向上按钮时 onOptionsItemSelected
没有被调用,当我按下菜单项时它可以正常工作。
使用 ActionBarToggle OnClickListener
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) {
}
});
但此方法也不会在按下向上按钮时调用。
结论:
那么,如何捕捉向上按钮按下事件?
你好如果你想拦截操作栏项目点击你需要首先将它添加到你的片段 onCreate:
setHasOptionsMenu(true);
只使用正确的 onOptionsItemSelected 方法(在 activity 中使用时片段版本不同):
@Override public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.your_action:
//do something
return true;
default:
return super.onOptionsItemSelected(item);
}
}//onOptionsItemSelected
希望对您有所帮助...
DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);//for fragment
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
//do samething
}
}
或使用这个
@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();
}
}
几天前我在某处发现了这个...
在我的代码中,我初始化了 ActionBarDrawerToggle
。它有一些构造函数,但我对此感兴趣:
1
public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,
@StringRes int openDrawerContentDescRes,
@StringRes int closeDrawerContentDescRes) {
this(activity, null, drawerLayout, null, openDrawerContentDescRes,
closeDrawerContentDescRes);
}
2
public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,
Toolbar toolbar, @StringRes int openDrawerContentDescRes,
@StringRes int closeDrawerContentDescRes) {
this(activity, toolbar, drawerLayout, null, openDrawerContentDescRes,
closeDrawerContentDescRes);
}
看看:第二个构造函数有Toolbar toolbar
个参数。
如果你想处理 UP BUTTON
事件 不要使用第二个构造函数,先使用。
示例:
toggle = new ActionBarDrawerToggle(
this,
drawer,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
getSupportActionBar().setHomeButtonEnabled(true);
setHomeButtonEnabled
很重要,没有这个你将看不到 Hamburger 或 Up 按钮。
对于使汉堡包按钮打开抽屉的默认行为,您可以使用此代码
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();
然后要覆盖任何子 activity 中的默认行为,请执行此操作
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。我们可以覆盖它以在单击向上按钮时调用我们的代码。
我在您的方法中添加了几行,以便实现后退按钮:
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);
}
}