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

Android 更改右侧抽屉的菜单项和汉堡按钮的位置,android,menu,menuitem,drawerlayout,Android,Menu,Menuitem,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/se

在我的
工具栏
中,我有一个菜单,其中有一项“设置”,还有一个
抽屉布局
,右边有一个汉堡图标

现在看起来是这样的:

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

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>

EndDrawerToggle
类来自。

工具栏中的菜单将始终固定在末尾,除了以某种方式直接修改
工具栏
的行为之外,没有什么可以做的,这不是一件小事

一种选择是完全放弃菜单,将您自己的
按钮添加到
工具栏
以进行设置。不过,这可能有点笨拙,因为
EndDrawerToggle
按钮是动态创建和添加的,因此您希望在最后堆叠在它之前的任何其他
视图都必须以类似方式创建和添加,或者在设置切换后进行切换

但是,经过一些修改,我们可以让
EndDrawerToggle
直接与菜单集成,将其切换可绘制设置为我们在末尾添加的始终显示的菜单项上的图标。这实际上是一个更简单的类,因为我们不需要为drawable提供
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) {}
}
初始化基本相同;按常规实例化,并在
抽屉布局
上添加为
DrawerListener

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;
}
我们不使用此类调用
syncState()
,因为可以在上面的方法中正确同步绘图


请注意,此示例只是将一个
菜单项添加到现有的
菜单
,并将该项设置为
SHOW\u as\u ACTION\u ALWAYS
。这将根据给定菜单的需要工作,但如果与任何具有溢出项的菜单一起使用,则三点溢出图标将出现在切换之后


在这种情况下,如果您仍然希望在最后切换,则必须“手动”处理溢出;e、 例如,为三点图标添加一个自定义项,并在弹出窗口中打开一个单独的菜单。

工具栏中的菜单将始终固定在末尾,除了以某种方式直接修改
工具栏的行为之外,没有什么可以做的,这不是一件小事

一种选择是完全放弃菜单,将您自己的
按钮添加到
工具栏
以进行设置。不过,这可能有点笨拙,因为
EndDrawerToggle
按钮是动态创建和添加的,因此您希望在最后堆叠在它之前的任何其他
视图都必须以类似方式创建和添加,或者在设置切换后进行切换

但是,经过一些修改,我们可以让
EndDrawerToggle
直接与菜单集成,将其切换可绘制设置为我们在末尾添加的始终显示的菜单项上的图标。这实际上是一个更简单的类,因为我们不需要为drawable提供
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) {}
}
初始化基本相同;按常规实例化,并在
抽屉布局
上添加为
DrawerListener

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;
}
我们不使用此类调用
syncState()
,因为可以在上面的方法中正确同步绘图


请注意,此示例只是将一个
菜单项添加到现有的
菜单
,并将该项设置为
SHOW\u as\u ACTION\u ALWAYS
。这将根据给定菜单的需要工作,但如果与任何具有溢出项的菜单一起使用,则三点溢出图标将出现在切换之后

在这种情况下,如果您仍然希望在最后切换,则必须“手动”处理溢出;e、 例如,为三点图标添加一个自定义项,并在弹出窗口中打开一个单独的菜单