至少Gmail和Youtube Android应用使用侧边菜单(navigation drawer?),可以通过滑动或点击应用图标(主页按钮)打开:
上面屏幕截图中的菜单指示符/图标是Android SDK的现成部分吗? (或Google在其应用中使用的自定义图标?)无论如何,最简单的方法是让您的主页按钮看起来像,就像打开菜单一样? / p>
(targetSdkVersion
18; minSdkVersion
14)
最后got it working。对我来说遗漏的是1)the actual icon和2)syncState()
上对ActionBarDrawerToggle
的延期电话。
答案 0 :(得分:33)
要在您的应用程序中创建类似的实现/外观,您应该使用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找到它;见Navigation Drawer Indicator。
参考文献
答案 1 :(得分:10)
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-Developer's answer版本。
非常奇怪的是,我的ActionBarDrawerToggle初始化代码中缺少的是:
// Defer code dependent on restoration of previous instance state.
drawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
如果包含此内容,则需要调用setHomeAsUpIndicator()
。
答案 2 :(得分:2)
此处的关键字为NavigationDrawer
; Android开发者网站上有一个完整的工作代码示例。
阅读LINK GIVEN的结尾:使用应用程序图标打开和关闭
从那里复制以下代码
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);
}
...
}
有些文件可以下载,带有动画效果的小3行就是充分的例证。
您必须在相应的drawable
文件夹中复制这些文件。根据您使用的主题,黑暗或浅色,您有一组不同的图标。
就我而言,我只是将drawer_shadow.9.png
和ic_drawer.png
复制到drawable文件夹中并按照示例进行操作,一切正常。
这些图标位于我提供的链接中,但它们在<操作栏图标包中不,它们位于示例应用中相应的res / drawable文件夹。