Toolbar
의 메뉴는 항상 Toolbar
의 동작을 수정하는 것 외에는 별다른 의미가 없는데, 그다지 간단하지는 않습니다.
하나의 옵션은 설정을 위해 Toolbar
에 자신의 Button
을 추가하는 것입니다. 그래도 EndDrawerToggle
의 Button
이 동적으로 생성되어 추가되기 때문에 약간 다루기가 힘들 수 있습니다. 따라서 최종적으로 쌓기를 원하는 다른 모든 View
은 비슷하게 생성되고 추가되어야합니다. 토글이 설정되었습니다.
그러나 일부 수정을 통해 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 도트 아이콘에 대한 사용자 정의 항목을 추가하고 팝업 메뉴에서 별도의 메뉴를 열면됩니다.