ActionBarDrawerToggle
,并将你的自定义图标设置为 ActionBar 主页按钮旁边的指示器。例如:import android.app.ActionBar;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
private void setUpDrawerToggle(){
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the navigation drawer and the action bar app icon.
mDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
R.string.navigation_drawer_open, /* "open drawer" description for accessibility */
R.string.navigation_drawer_close /* "close drawer" description for accessibility */
) {
@Override
public void onDrawerClosed(View drawerView) {
invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
};
// Defer code dependent on restoration of previous instance state.
// NB: required for the drawer indicator to show up!
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
R.drawable.ic_drawer
是用作指示器的图标。你可以在Android Asset Studio找到它;请参见导航抽屉指示器。
参考文献
Android-Developer和HpTerm帮我找对了方向:
ic_drawer.png
图标 (→ Android Asset Studio)不幸的是,像下面这样创建ActionBarDrawerToggle似乎还不够,至少我的Nexus 7(API 18)测试设备上如此。
drawerToggle = new ActionBarDrawerToggle(this,
drawerLayout,
R.drawable.ic_navigation_drawer,
R.string.side_menu_open,
R.string.side_menu_closed) {
// ...
};
我找到了一种让这个指示器出现的方法: setHomeAsUpIndicator()
。但是不足之处是,该方法是在API级别18中添加的。
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
getActionBar().setDisplayHomeAsUpEnabled(true); // also required
if (Build.VERSION.SDK_INT >= 18) {
getActionBar().setHomeAsUpIndicator(
getResources().getDrawable(R.drawable.ic_navigation_drawer));
}
}
现在问题仍然存在:如何使这在API 14到17的级别中工作(在我的情况下)?
我在一个4.1.2(API 16)设备上验证了ic_drawer
图标没有显示。使用 setDisplayHomeAsUpEnabled(true)
会得到正常的“主页”图标(一个指向左的小箭头),如果没有它,我的应用程序图标左侧的空间将保持空白。
使用编辑过的Android开发者的答案的版本让它工作起来了。
非常奇怪的是,我的ActionBarDrawerToggle初始化代码中缺少了这一点:
// Defer code dependent on restoration of previous instance state.
drawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
在这种情况下,调用setHomeAsUpIndicator()
是不必要的。
NavigationDrawer
}};在Android开发者网站上有一个完整的可工作代码示例。
请阅读所提供链接的末尾:使用应用程序图标打开和关闭。public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
...
public void onCreate(Bundle savedInstanceState) {
...
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description */
R.string.drawer_close /* "close drawer" description */
) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
}
};
// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Pass the event to ActionBarDrawerToggle, if it returns
// true, then it has handled the app icon touch event
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle your other action bar items...
return super.onOptionsItemSelected(item);
}
...
}
NavigationDrawer
还是只是想要与图片中相同的外观?抽屉指示器是一个自定义图标,不仅谷歌使用它来表示从ActionBar
按下主页按钮将打开菜单。 - hardartcoreNavigationDrawer
,并且我想要与图片中相同的外观。 :) - Jonik