如何在Action Bar的应用程序图标旁边添加"菜单"指示器?

Jon*_*nik 24 android android-icons android-actionbar navigation-drawer android-homebutton

至少Gmail和Youtube Android应用程序使用侧边菜单(导航抽屉?),通过滑动或单击应用程序图标(主页按钮)打开:

在此输入图像描述

屏幕截图中的菜单指示符/图标是Android SDK的现成部分吗?(或谷歌在他们的应用程序中使用的自定义图标?)无论如何,最简单的方法是让你的主页按钮看起来像这样,就像打开一个菜单一样?

(targetSdkVersion18; minSdkVersion14)

解析度

终于搞定了.少了什么对我来说是1)实际图标和2)递延调用syncState()ActionBarDrawerToggle.

har*_*ore 33

要在应用程序中创建类似的实现/外观,您应该使用ActionBarDrawerToggleActionBar主页按钮旁边的自定义图标作为指示符.例如 :

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);
}
Run Code Online (Sandbox Code Playgroud)

R.drawable.ic_drawer实际上用作指示符的图标在哪里.您可以在Android Asset Studio中找到它; 请参阅导航抽屉指示器.

参考

  1. ActionBarDrawerToggle
  2. 创建导航抽屉

  • 您也可以从这里获取它们:http://android-ui-utils.googlecode.com/hg/asset-studio/dist/icons-nav-drawer-indicator.html#theme=light&color=33b5e5%2C40 (3认同)

Jon*_*nik 10

Android-DeveloperHpTerm在正确的方向上帮助了我

  1. 指出这确实是NavigationDrawer特定的(我已经在谷歌的例子中使用)
  2. 告诉在哪里找到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) {
    // ...
};
Run Code Online (Sandbox Code Playgroud)

部分解决方案(API级别18+)

我找到了一种让指示器出现的方法: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));
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在问题仍然存在:如何使这个(在我的情况下)API级别14到17工作?

我在4.1.2(API 16)设备上验证了ic_drawer图标没有显示.随着setDisplayHomeAsUpEnabled(true)我获得正常的"主页"图标(小箭头指向左侧),没有它,我的应用程序图标留下的空间仍为空白.

最终解决方案

使用Android-Developer的编辑版本来解决问题.

非常奇怪的是,我的ActionBarDrawerToggle初始化代码中缺少的是:

   // Defer code dependent on restoration of previous instance state.
   drawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });
Run Code Online (Sandbox Code Playgroud)

与包括,调用setHomeAsUpIndicator()不是需要.