更改右侧抽屉的菜单项和汉堡按钮的位置

时间:2017-11-04 19:42:19

标签: android menu menuitem drawerlayout

在我的Toolbar中,我有一个菜单,其中包含一项“设置”,一个DrawerLayout的汉堡图标与右侧对齐。

现在看起来像这样:

enter image description here

我希望汉堡包在右边,就像这样:

enter image description here

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

1 个答案:

答案 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将在上述方法中正确同步。

screenshot

请注意,此示例只是向现有syncState()添加MenuItem,并将该项设置为Menu。这将按照给定菜单的要求工作,但如果这与任何具有溢出项目的菜单一起使用,则三点溢出图标将显示在切换之后。

在这种情况下,如果你仍然希望在最后进行切换,则必须处理溢出&#34;手动&#34 ;;例如,通过为三点图标添加自定义项目,并在弹出窗口中打开单独的菜单。