在我的Toolbar
中,我有一个菜单,其中包含一项“设置”,一个DrawerLayout
的汉堡图标与右侧对齐。
现在看起来像这样:
我希望汉堡包在右边,就像这样:
menu.xml
:
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/settings"
android:icon="@drawable/ic_settings_black_48dp"
app:showAsAction="always" />
</menu>
MainActivity
:
public class MainActivity extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
//EndDrawerToggle is class for setup DrawerLayout with an end-aligned drawer
private EndDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context=this;
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
myToolbar.setTitle("");
setSupportActionBar(myToolbar);
drawerToggle = new EndDrawerToggle(this,
mDrawerLayout,
myToolbar,
R.string.drawer_open,
R.string.drawer_close);
mDrawerLayout.addDrawerListener(drawerToggle);
//....
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.settings) {
//do smth
}
return super.onOptionsItemSelected(item);
}
}
EndDrawerToggle
课程来自this answer。
答案 0 :(得分:1)
body {
background: black;
background-image:
url("http://yourdomain.com/images/texture.png");
}
中的菜单将始终固定到最后,除了直接修改Toolbar
的行为外,除此之外没有太多可以做的事情。不知何故,这不会是微不足道的。
一种选择是完全放弃菜单,并将自己的Toolbar
添加到Button
进行设置。但是,这可能有点笨拙,因为Toolbar
EndDrawerToggle
是动态创建和添加的,因此您需要在其之前堆叠的任何其他Button
最后必须以相似的方式创建和添加,或者在切换设置完毕后徘徊。
然而,通过一些修改,我们可以让View
直接与菜单集成,将其切换为可绘制的,作为我们最后添加的总是显示的菜单项上的图标。这实际上最终是一个更简单的类,因为我们不需要为drawable提供EndDrawerToggle
,就像我们在将切换直接添加到ImageButton
时所做的那样。
Toolbar
初始化基本相同;按惯例进行实例化,并在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) {}
}
上添加DrawerListener
。
DrawerLayout
区别在于drawerToggle = new EndMenuDrawerToggle(mDrawerLayout,
myToolbar,
R.string.open_drawer_end,
R.string.close_drawer_end);
mDrawerLayout.addDrawerListener(drawerToggle);
...
方法,我们将那里的菜单传递给切换的onCreateOptionsMenu()
方法。
setToggleOnMenu()
我们不会使用此类调用@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
drawerToggle.setToggleOnMenu(menu);
return true;
}
,因为drawable将在上述方法中正确同步。
请注意,此示例只是向现有syncState()
添加MenuItem
,并将该项设置为Menu
。这将按照给定菜单的要求工作,但如果这与任何具有溢出项目的菜单一起使用,则三点溢出图标将显示在切换之后。
在这种情况下,如果你仍然希望在最后进行切换,则必须处理溢出&#34;手动&#34 ;;例如,通过为三点图标添加自定义项目,并在弹出窗口中打开单独的菜单。