如何在ActionBar中制作抽屉图标和标志两个不同的按钮
How to make Drawer icon and logo two different button in ActionBar
我有一个问题,我需要能够从我的操作栏中单击徽标和后退箭头+hamburger/cater。当我的后台没有任何东西时,会显示汉堡包图标并打开我的左侧抽屉(然后通过动画它变为箭头以关闭抽屉)。
显示 AppLogo 旁边的图标:
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
我有 ActionBarDrawerToggle
检查是否打开了左抽屉(因为我还有右抽屉,不能干扰汉堡包图标动画)。
ActionBarDrawerToggle
mDrawerListener = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_closed) {
//must override these methods to make only left drawer change the icon of drawer in the corner, when opened
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
if (drawerView.getId() == R.id.left_drawer) {
super.onDrawerSlide(drawerView, slideOffset);
}
}
@Override
public void onDrawerOpened(View drawerView) {
if (drawerView.getId() == R.id.left_drawer) {
super.onDrawerOpened(drawerView);
}
}
@Override
public void onDrawerClosed(View drawerView) {
if (drawerView.getId() == R.id.left_drawer) {
super.onDrawerClosed(drawerView);
}
}
};
drawerLayout.setDrawerListener(mDrawerListener);
当可以导航 bask 时,图标会通过禁用指示器变为箭头
onBackStackChanged()
@Override
public void onBackStackChanged() {
// disable drawer icon and leave backarrow icon if backstack not empty
boolean canBack = getSupportFragmentManager().getBackStackEntryCount() > 0;
if (canBack) {
mDrawerListener.setDrawerIndicatorEnabled(false);
} else {
mDrawerListener.setDrawerIndicatorEnabled(true);
}
}
在 OnOptionsItemSelected()
中,我注意左抽屉(右抽屉关闭)或执行 navigateBack 操作。
OnOptionsItemSelected()
public boolean onOptionsItemSelected(MenuItem item) {
Helper.dismissKeyboard(this);
switch (item.getItemId()) {
case android.R.id.home:
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
onSupportNavigateUp();
} else {
if (drawerLayout.isDrawerOpen(drawerSports)) {
drawerLayout.closeDrawer(drawerSports);
} else {
if (drawerLayout.isDrawerOpen(lvMyAccount)) {
drawerLayout.closeDrawer(lvMyAccount);
}
drawerLayout.openDrawer(drawerSports);
}
}
return true;
Styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/MyActionBar</item>
<item name="actionBarStyle">@style/MyActionBar</item>
</style>
<style name="MyActionBar" >
<item name="android:background">@color/blue</item>
<item name="background">@color/blue</item>
<item name="android:logo">@drawable/logo_marathon</item>
<item name="logo">@drawable/logo_marathon</item>
<item name="android:displayOptions">showHome|useLogo</item>
<item name="displayOptions">showHome|useLogo</item>
</style>
...
这不是我的项目,所以我可能不知道所有的东西是如何配置的,除非必要,我不能对它做任何重大的改变,所以我需要在徽标上添加 onClick 方法,但我没有不知道怎么办。我试过 <item name="onClick">customLogoClickMethod</item>
,但没用。
在操作栏上创建您想要的视图。在其上设置所有侦听器,然后通过 getActionBar().setCustomView();
将视图设置为 actionbar
例如:
getActionBar().setDisplayOptions(
ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_USE_LOGO
| ActionBar.DISPLAY_SHOW_HOME
| ActionBar.DISPLAY_HOME_AS_UP);
LayoutInflater inflater = (LayoutInflater) this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// inflate the view that we created before
View v = inflater.inflate(R.layout.sample_titlebar, null);
//set all the listeners here with that view
//and than
getActionBar().setCustomView();
我有一个问题,我需要能够从我的操作栏中单击徽标和后退箭头+hamburger/cater。当我的后台没有任何东西时,会显示汉堡包图标并打开我的左侧抽屉(然后通过动画它变为箭头以关闭抽屉)。
显示 AppLogo 旁边的图标:
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
我有 ActionBarDrawerToggle
检查是否打开了左抽屉(因为我还有右抽屉,不能干扰汉堡包图标动画)。
ActionBarDrawerToggle
mDrawerListener = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_closed) {
//must override these methods to make only left drawer change the icon of drawer in the corner, when opened
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
if (drawerView.getId() == R.id.left_drawer) {
super.onDrawerSlide(drawerView, slideOffset);
}
}
@Override
public void onDrawerOpened(View drawerView) {
if (drawerView.getId() == R.id.left_drawer) {
super.onDrawerOpened(drawerView);
}
}
@Override
public void onDrawerClosed(View drawerView) {
if (drawerView.getId() == R.id.left_drawer) {
super.onDrawerClosed(drawerView);
}
}
};
drawerLayout.setDrawerListener(mDrawerListener);
当可以导航 bask 时,图标会通过禁用指示器变为箭头
onBackStackChanged()
@Override
public void onBackStackChanged() {
// disable drawer icon and leave backarrow icon if backstack not empty
boolean canBack = getSupportFragmentManager().getBackStackEntryCount() > 0;
if (canBack) {
mDrawerListener.setDrawerIndicatorEnabled(false);
} else {
mDrawerListener.setDrawerIndicatorEnabled(true);
}
}
在 OnOptionsItemSelected()
中,我注意左抽屉(右抽屉关闭)或执行 navigateBack 操作。
OnOptionsItemSelected()
public boolean onOptionsItemSelected(MenuItem item) {
Helper.dismissKeyboard(this);
switch (item.getItemId()) {
case android.R.id.home:
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
onSupportNavigateUp();
} else {
if (drawerLayout.isDrawerOpen(drawerSports)) {
drawerLayout.closeDrawer(drawerSports);
} else {
if (drawerLayout.isDrawerOpen(lvMyAccount)) {
drawerLayout.closeDrawer(lvMyAccount);
}
drawerLayout.openDrawer(drawerSports);
}
}
return true;
Styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/MyActionBar</item>
<item name="actionBarStyle">@style/MyActionBar</item>
</style>
<style name="MyActionBar" >
<item name="android:background">@color/blue</item>
<item name="background">@color/blue</item>
<item name="android:logo">@drawable/logo_marathon</item>
<item name="logo">@drawable/logo_marathon</item>
<item name="android:displayOptions">showHome|useLogo</item>
<item name="displayOptions">showHome|useLogo</item>
</style>
...
这不是我的项目,所以我可能不知道所有的东西是如何配置的,除非必要,我不能对它做任何重大的改变,所以我需要在徽标上添加 onClick 方法,但我没有不知道怎么办。我试过 <item name="onClick">customLogoClickMethod</item>
,但没用。
在操作栏上创建您想要的视图。在其上设置所有侦听器,然后通过 getActionBar().setCustomView();
将视图设置为 actionbar例如:
getActionBar().setDisplayOptions(
ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_USE_LOGO
| ActionBar.DISPLAY_SHOW_HOME
| ActionBar.DISPLAY_HOME_AS_UP);
LayoutInflater inflater = (LayoutInflater) this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// inflate the view that we created before
View v = inflater.inflate(R.layout.sample_titlebar, null);
//set all the listeners here with that view
//and than
getActionBar().setCustomView();