Toolbar
のメニューは常に最後に固定されていますが、何とかしてToolbar
の動作を何らかの形で直接変更することを除けばそれほど多くはありません。
1つのオプションは、メニューを完全に捨てて、Toolbar
に独自のButton
を追加することです。しかし、EndDrawerToggle
のButton
が動的に作成され追加されるため、最後にスタックする前にスタックしたいと思うその他のものは、作成して同様に追加するか、トグルが設定されています。
しかし、いくつかの変更を加えれば、EndDrawerToggle
をメニューと直接統合し、最後に追加する常に表示されるメニュー項目のトグル描画可能なアイコンをアイコンとして設定することができます。実際には、Toolbar
に直接トグルを追加するときと同じように、ドロアブルにImageButton
を指定する必要がないので、これは実際にはより簡単なクラスになります。
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.graphics.drawable.DrawerArrowDrawable;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
public class EndMenuDrawerToggle implements DrawerLayout.DrawerListener {
private final DrawerLayout drawerLayout;
private final Toolbar toolbar;
private final DrawerArrowDrawable arrowDrawable;
private final int openDrawerContentDesc, closeDrawerContentDesc;
private MenuItem toggleItem;
public EndMenuDrawerToggle(DrawerLayout drawerLayout, Toolbar toolbar,
int openDrawerContentDesc, int closeDrawerContentDesc) {
this.drawerLayout = drawerLayout;
this.toolbar = toolbar;
this.openDrawerContentDesc = openDrawerContentDesc;
this.closeDrawerContentDesc = closeDrawerContentDesc;
arrowDrawable = new DrawerArrowDrawable(toolbar.getContext());
arrowDrawable.setDirection(DrawerArrowDrawable.ARROW_DIRECTION_END);
}
public void setToggleOnMenu(Menu menu) {
toggleItem = menu.add(openDrawerContentDesc);
toggleItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
toggleItem.setIcon(arrowDrawable);
toggleItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
toggle();
return true;
}
}
);
setPosition(drawerLayout.isDrawerOpen(GravityCompat.END) ? 1f : 0f);
}
private void toggle() {
final int drawerLockMode = drawerLayout.getDrawerLockMode(GravityCompat.END);
if (drawerLayout.isDrawerVisible(GravityCompat.END)
&& (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_OPEN)) {
drawerLayout.closeDrawer(GravityCompat.END);
}
else if (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_CLOSED) {
drawerLayout.openDrawer(GravityCompat.END);
}
}
private void setPosition(float position) {
if (position == 1f) {
arrowDrawable.setVerticalMirror(true);
toggleItem.setTitle(closeDrawerContentDesc);
}
else if (position == 0f) {
arrowDrawable.setVerticalMirror(false);
toggleItem.setTitle(openDrawerContentDesc);
}
arrowDrawable.setProgress(position);
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
setPosition(Math.min(1f, Math.max(0f, slideOffset)));
}
@Override
public void onDrawerOpened(View drawerView) {
setPosition(1f);
}
@Override
public void onDrawerClosed(View drawerView) {
setPosition(0f);
}
@Override
public void onDrawerStateChanged(int newState) {}
}
初期化は基本的に同じです。通常はインスタンス化し、DrawerLayout
にDrawerListener
として追加します。
drawerToggle = new EndMenuDrawerToggle(mDrawerLayout,
myToolbar,
R.string.open_drawer_end,
R.string.close_drawer_end);
mDrawerLayout.addDrawerListener(drawerToggle);
...
違いは、我々はトグルのsetToggleOnMenu()
方法にあっ膨らまメニューを渡すonCreateOptionsMenu()
方法で提供されます。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
drawerToggle.setToggleOnMenu(menu);
return true;
}
描画可能が正しく、上記の方法で同期されるように我々は、このクラスでsyncState()
を呼び出すことはありません。
この例では、単に既存のMenu
にMenuItem
を追加し、SHOW_AS_ACTION_ALWAYS
としてその項目を設定しますのでご注意ください。これは、指定されたメニューで必要に応じて機能しますが、オーバーフロー項目を持つメニューでこれを使用すると、3ドットオーバーフローアイコンがトグルを超えて表示されます。
この場合、トグルを最後に残しておきたい場合は、オーバーフローを「手動で」処理する必要があります。たとえば、3ドットアイコンのカスタム項目を追加し、ポップアップで別のメニューを開くことによって、