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

时间:2013-11-01 10:05:20

标签: android android-actionbar navigation-drawer android-icons android-homebutton

至少Gmail和Youtube Android应用使用侧边菜单(navigation drawer?),可以通过滑动或点击应用图标(主页按钮)打开:

enter image description here

上面屏幕截图中的菜单指示符/图标是Android SDK的现成部分吗? (或Google在其应用中使用的自定义图标?)无论如何,最简单的方法是让您的主页按钮看起来像,就像打开菜单一样? / p>

targetSdkVersion 18; minSdkVersion 14)

分辨率

最后got it working。对我来说遗漏的是1)the actual icon和2)syncState()上对ActionBarDrawerToggle的延期电话。

3 个答案:

答案 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. ActionBarDrawerToggle
  2. Creating a Navigation Drawer

答案 1 :(得分:10)

Android-DeveloperHpTerm通过

帮助我找到正确的方向
  1. 指出这确实是NavigationDrawer具体的(我已经在谷歌的例子中使用过)
  2. 告诉在哪里找到ic_drawer.png图标(→Android Asset Studio
  3. 现在,不幸的是,如下所示创建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) {
        // ...
    };
    

    部分解决方案(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));
        }
    }
    

    所以现在问题仍然存在:如何在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.pngic_drawer.png复制到drawable文件夹中并按照示例进行操作,一切正常。

这些图标位于我提供的链接中,但它们在<操作栏图标包中它们位于示例应用相应的res / drawable文件夹