如何用自定义drawable替换Android工具栏上用于ActionBarToggle的汉堡包图标?

jet*_*jet 33 android navigation-drawer android-toolbar

我已经使用Android 5.0中的新工具栏实现了一个基本的ActionBarDrawerToggle.

但是,我无法弄清楚如何更改提供的默认汉堡包图标.从android文档中可以看出"给定的Activity将链接到指定的DrawerLayout,工具栏的导航图标将设置为自定义drawable ...这个drawable在抽屉关闭时显示汉堡图标,在抽屉打开时显示箭头当抽屉打开时,它会在这两个状态之间激活."

我目前使用以下代码正常工作,但是我想用我自己的drawable替换默认提供的汉堡包.

这是我目前的代码:

MainActivity.java

@InjectView(R.id.main_activity_toolbar)
Toolbar mToolbar;

@InjectView(R.id.main_activity_drawer_layout)
DrawerLayout mDrawerLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.main_activity);
    super.onCreate(savedInstanceState);

    setSupportActionBar(mToolbar);
    mToolbar.setNavigationIcon(R.drawable.navigation);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.drawer_open, R.string.drawer_close) {
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            invalidateOptionsMenu();
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

这一行:

mToolbar.setNavigationIcon(R.drawable.navigation);
Run Code Online (Sandbox Code Playgroud)

似乎不起作用.

这可能吗?谢谢!

ActionBarToggle文档 - https://developer.android.com/reference/android/support/v7/app/ActionBarDrawerToggle.html

小智 27

这两行代码对我有用:

mDrawerToggle.setDrawerIndicatorEnabled(false); //disable "hamburger to arrow" drawable
mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_drawer); //set your own
Run Code Online (Sandbox Code Playgroud)

然后打电话给:

mDrawerToggle.syncState();
Run Code Online (Sandbox Code Playgroud)

  • 您的代码更改图标,但图标的点击消失了。 (2认同)

Roi*_*oen 25

您可以使用工具栏作为单机模式下,这意味着你应该使用的工具栏为您的一部分ActionBarDrawerToggle构造,就可以实现,使用下面的代码:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, null,
                       R.drawable.appbar, R.drawable.appbar)
Run Code Online (Sandbox Code Playgroud)

(注意工具栏实例未如何发送到ActionBarDrawerToggle构造函数)

此外,您应手动充气菜单

mToolbar = (Toolbar) findViewById(R.id.nav_toolbar);
mToolbar.inflateMenu(R.menu.base);
Run Code Online (Sandbox Code Playgroud)

除去所述setSupportActionBar(mToolbar); 代码行.

当然,您必须自己处理导航点击:

mToolbar.setOnMenuItemClickListener(new OnMenuItemClickListener() ...
Run Code Online (Sandbox Code Playgroud)

然后,您可以这样打开您的抽屉:

drawerButton = (BadgeDrawerButton) findViewById(R.id.badge_drawer_button);
drawerButton.setOnClickListener(
                       new View.OnClickListener() {

                              @Override
                              public void onClick(View v) {
                                     mDrawerLayout.openDrawer(Gravity.LEFT);
                              }
                       });
Run Code Online (Sandbox Code Playgroud)

希望这可能有所帮助.


Kev*_*vin 8

ActionBarDrawerToggle的默认菜单是DrawerArrowDrawable.

您可以将其子类化以添加自定义功能,例如徽章,如下所示:

public class BadgedDrawerArrowDrawable extends DrawerArrowDrawable {

    /**
     * @param context used to get the configuration for the drawable from
     */
    public BadgedDrawerArrowDrawable(Context context) {
        super(context);

        setColor(context.getResources().getColor(R.color.colorAccent));
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);

        Paint paint = new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.RED);
        paint.setTextSize(60);
        canvas.drawText("!", canvas.getWidth() - 60, 25, paint);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

actionBarDrawerToggle.setDrawerArrowDrawable(new BadgedDrawerArrowDrawable(activity));
Run Code Online (Sandbox Code Playgroud)

  • 辉煌.汉堡包的完美解决方案.我指出的唯一不是在draw()调用中分配Paint. (3认同)

Dod*_*ono 7

我的解决方案是通过继承ActionBarDrawerToggle.

public class MyActionBarDrawerToggle extends android.support.v7.app.ActionBarDrawerToggle {

    public MyActionBarDrawerToggle(Activity activity, final DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes) {
        super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes);

        setHomeAsUpIndicator(R.drawable.drawer_toggle);
        setDrawerIndicatorEnabled(false);

        setToolbarNavigationClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                drawerLayout.openDrawer(Gravity.LEFT);
            }
        });
     }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

对我toolbar.setNavigationIcon(R.drawable.ic_camera_alt_24dp); 有用的事情是,我只需要在onCreate结束时打电话,或至少在之后mDrawerToggle = new ActionBarDrawerToggle...


Das*_*thu 5

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,drawer,toolbar,R.string.navigation_drawer_open,R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);

toggle.syncState();
toolbar.setNavigationIcon(R.drawable.ic_action_name);
Run Code Online (Sandbox Code Playgroud)