web-dev-qa-db-ja.com

ActionBarToggle on Androidツールバーをカスタムドロアブルに使用するために使用されるハンバーガーアイコンを置き換える方法は?

Android 5.0。の新しいツールバーを使用して、基本的なActionBarDrawerToggleを実装しました。

ただし、提供されているデフォルトのハンバーガーアイコンを変更する方法はわかりません。 Androidドキュメンテーションから、「指定されたアクティビティは指定されたDrawerLayoutにリンクされ、ツールバーのナビゲーションアイコンはカスタムのドロアブルに設定されます...引き出しが開いている場合は閉じられ、矢印が表示されます。引き出しが開くと、これら2つの状態の間でアニメーション表示されます。」

現在、これはすべて次のコードで正しく動作していますが、デフォルトで提供されているハンバーガーを独自のドロアブルに置き換えたいと思います。

ここに私の現在のコードがあります:

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);
}

この行:

mToolbar.setNavigationIcon(R.drawable.navigation);

動作しないようです。

これは可能ですか?ありがとう!

ActionBarToggleドキュメント- https://developer.Android.com/reference/Android/support/v7/app/ActionBarDrawerToggle.html

32
jet

ツールバーをスタンドアロンモードとして使用できます。つまり、notツールバーをActionBarDrawerToggleコンストラクターの一部として使用する必要があります。これは、以下のコードを使用して実現できます。

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, null,
                       R.drawable.appbar, R.drawable.appbar)

(ツールバーインスタンスがActionBarDrawerToggleコンストラクタに送信されていないことに注意してください)

また、メニューを手動で膨らませる必要があります

mToolbar = (Toolbar) findViewById(R.id.nav_toolbar);
mToolbar.inflateMenu(R.menu.base);

削除setSupportActionBar(mToolbar);コード行。

もちろん、ナビゲーションクリックを自分で処理する必要があります。

mToolbar.setOnMenuItemClickListener(new OnMenuItemClickListener() ...

その後、次のように引き出しを開くことができます。

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

                              @Override
                              public void onClick(View v) {
                                     mDrawerLayout.openDrawer(Gravity.LEFT);
                              }
                       });

これが役立つことを願っています。

24
Roisgoen

これらの2行のコードは、私にとっては有効です。

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

そして、これを呼び出します:

mDrawerToggle.syncState();
26
PhoEn-X

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);
    }
}

使用法:

actionBarDrawerToggle.setDrawerArrowDrawable(new BadgedDrawerArrowDrawable(activity));
7
Kevin

私の解決策は、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);
            }
        });
     }
}

私のために働いたのは、onCreateの最後に、または少なくとも_mDrawerToggle = new ActionBarDrawerToggle..._の後にtoolbar.setNavigationIcon(R.drawable.ic_camera_alt_24dp);を呼び出す必要があったことです

6
pgarzina

2018年1月現在、これは実用的なソリューションです(少なくとも私にとって):

_    //setSupportActionBar(toolbar)

    val toggle = ActionBarDrawerToggle(this, drawer_layout, null, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
    toolbar.inflateMenu(R.menu.menu_main)
    toolbar.setNavigationIcon(R.drawable.ic_menu)
    toolbar.setNavigationOnClickListener {
        drawer_layout.openDrawer(Gravity.START)
    }

    toolbar.setOnMenuItemClickListener {
        true
    }

    drawer_layout.addDrawerListener(toggle)
    toggle.syncState()

    nav_view.setNavigationItemSelectedListener(this)
_

気にすること:

  • setSupportActionBarはコメントアウトする必要があります
  • ActionBarDrawerToggletoolbarへの参照を取得していません
  • メニューを自分で膨らませて、onClickを処理する必要があります。 onCreateOptionsMenuおよびonOptionsItemSelectedは機能しません。
  • toggle.syncState()を呼び出すことを忘れないでください
2
guness

V7サポートライブラリに関しては、DrawerArrowDrawableの独自の表現を作成できます。

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {

            public void onDrawerClosed(View view) {
                supportInvalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                supportInvalidateOptionsMenu();
            }
        };
        mDrawerToggle.setDrawerIndicatorEnabled(true);

        DrawerArrowDrawable drawerArrowDrawable = new DrawerArrowDrawable(this);
        drawerArrowDrawable.setAlpha(1);
        drawerArrowDrawable.setSpinEnabled(false);
        drawerArrowDrawable.setDirection(DrawerArrowDrawable.ARROW_DIRECTION_LEFT);
        drawerArrowDrawable.setColor(Color.BLACK);

        mDrawerToggle.setDrawerArrowDrawable(drawerArrowDrawable);
2
Nikita Yankov

これが、私がようやく私の仕事に就くことができた方法です。

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

if (toolbar != null) {
    setSupportActionBar(toolbar);
    toolbar.setNavigationIcon(R.drawable.ic_drawer);

    mDrawerToggle = new ActionBarDrawerToggle(this,
                mDrawerLayout,
                toolbar,
                R.string.drawer_open,
                R.string.drawer_close) {

        /** Called when a drawer has settled in a completely closed state. */
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
        }

        /** Called when a drawer has settled in a completely open state. */
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
        }
    };

    // Set the drawer toggle as the DrawerListener
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerToggle.syncState();

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
}

それが判明した

mDrawerToggle.syncState();

これでようやくすべてが機能しました。

1
Bensonius
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);
0

syncState()ライフサイクルメソッドにonPostCreate(...)を呼び出すことをお勧めします。

@Override
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    mDrawerToggle.syncState();
}
0
Michio