Android导航抽屉向右切换图标

Android导航抽屉向右切换图标,android,navigation-drawer,Android,Navigation Drawer,我的要求如下图所示,我的导航抽屉应从右侧打开。我已经实现了这一点。我的导航抽屉从右到左打开。但问题是切换图标总是在左侧。如何将切换图标设置为右侧 我已经检查了以下问题,但没有一个能帮上忙: 以下是我尝试过的: 我的布局代码活动\u main.xml <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas

我的要求如下图所示,我的导航抽屉应从右侧打开。我已经实现了这一点。我的导航抽屉从右到左打开。但问题是切换图标总是在左侧。如何将切换图标设置为右侧

我已经检查了以下问题,但没有一个能帮上忙:

以下是我尝试过的:

我的布局代码活动\u main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="end">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:context="com.example.nav.MainActivity"
        android:foregroundGravity="right">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="end"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                android:layout_gravity="right"
                app:popupTheme="@style/AppTheme.PopupOverlay"
                android:foregroundGravity="right"
                android:textAlignment="viewEnd"
                android:touchscreenBlocksFocus="false" />

        </android.support.design.widget.AppBarLayout>

        <include layout="@layout/content_main" />

    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_height="match_parent"
        android:layout_width="wrap_content"
        android:layout_gravity="end"
        app:headerLayout="@layout/nav_header"
        app:menu="@menu/menu_navigation"
        android:textAlignment="viewEnd" />


</android.support.v4.widget.DrawerLayout>

在android清单中添加以下行:

android:supportsRtl="true"
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
对于您的应用程序,如下所示:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
警告:::这仅适用于SdkVersion 17+,因此,如果您的应用程序针对的是较低的最小SDK,则必须创建自定义菜单并覆盖OnCreateOptions方法(除非有我不知道的其他方法,这是绝对可能的)

确实没有(实际的)方法让
操作BarDrawerToggle
这样做,因为它总是设置在开始/左侧导航按钮上。但是,该类基本上只是一个
DrawerListener
,它管理一个专门的
Drawable
,并将
ImageButton
连接到
DrawerLayout
。我们可以为带有
ImageButton
的末端/右侧抽屉组装类似的东西,我们可以将其放置在
工具栏的同一侧(本例中需要该按钮)

公共类EndDrawerToggle实现了DrawerLayout.DrawerListener{
私人最终付款人布局付款人布局;
私有最终AppCompatImageButton toggleButton;
私有最终int OPENDROURCONTENTDESCRES;
私人最终int closeDrawerContentDescRes;
私人抽屉可抽箭头可抽;
公共端抽屉切换(抽屉布局、抽屉布局、工具栏、,
int-openDrawerContentDescRes,int-closeDrawerContentDescRes){
this.drawerLayout=抽屉布局;
this.openDrawerContentDescRes=openDrawerContentDescRes;
this.closeDrawerContentDescRes=closeDrawerContentDescRes;
toggleButton=新建AppCompatImageButton(toolbar.getContext(),null,
R.attr.工具栏导航按钮样式);
addView(toggleButton,new toolbar.LayoutParams(GravityCompat.END));
setOnClickListener(v->toggle());
loadDrawerArrowDrawable();
}
公共状态(){
if(抽屉布局isDrawerOpen(重力比较结束)){
设置位置(1f);
}否则{
设置位置(0f);
}
}
公共无效OnConfiguration已更改(配置newConfig){
loadDrawerArrowDrawable();
syncState();
}
@凌驾
绘图滑块上的公共无效(@非空视图抽屉视图,浮动滑块偏移){
设置位置(数学最小值(1f,数学最大值(0f,滑动偏移));
}
@凌驾
已打开的公共void onDrawerOpen(@NonNull视图抽屉视图){
设置位置(1f);
}
@凌驾
公共void onDrawerClosed(@NonNull视图抽屉视图){
设置位置(0f);
}
@凌驾
公共无效onDrawerStateChanged(int newState){}
私有void loadDrawerable(){
arrowDrawable=新抽屉RowDrawable(toggleButton.getContext());
箭头可绘制。设置方向(抽屉可绘制。箭头方向\u结束);
toggleButton.setImageDrawable(箭头可绘制);
}
私有无效切换(){
final int drawerLockMode=drawerLayout.getDrawerLockMode(GravityCompat.END);
if(抽屉布局可维护(重力比较结束)
&&(抽屉锁定模式!=抽屉布局。锁定\模式\锁定\打开)){
抽屉布局。关闭抽屉(重力压缩结束);
}else if(抽屉锁定模式!=抽屉布局。锁定模式\u锁定\u关闭){
抽屉布局。打开抽屉(重力compat.END);
}
}
专用无效设置位置(浮动位置){
如果(位置==1f){
箭头可绘制。设置垂直镜像(真);
setContentDescription(closeDrawerContentDescRes);
}否则如果(位置==0f){
箭头可绘制。设置垂直镜像(假);
setContentDescription(OpenDroperContentDescres);
}
箭头可绘制。设置进度(位置);
}
私有void setContentDescription(int resId){
setContentDescription(toggleButton.getContext().getText(resId));
}
}
EndDrawerToggle
类的工作方式与
ActionBarDrawerToggle
工具栏一起使用时的工作方式完全相同(除了构造函数调用不需要
活动
参数):首先实例化切换,然后将其添加为
DrawerToggle
,并在
活动的
onPostCreate()
方法中同步它。如果您已经覆盖了
活动
onConfigurationChanged()
方法,您将需要在那里调用切换对应的方法,就像调用
ActionBarDrawerToggle
一样

private-EndDrawerToggle-drawerToggle;
public void initNavigationDrawer(){
...
抽屉布局=(抽屉布局)findViewById(R.id.抽屉);
抽屉切换=新的末端抽屉切换(抽屉布局,
工具栏,
R.string.drawer\u打开,
R.string.抽屉(U关闭);
抽屉布局。添加抽屉链接(抽屉切换);
}
@凌驾
后期创建时受保护的空(捆绑包savedInstanceState){
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@凌驾
公共无效OnConfiguration已更改(配置newConfig){
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}

如果您有两个抽屉,并且需要同时使用
ActionBarDrawerToggle
EndDrawerToggle
,这是可能的,但我们需要处理拦截和分派抽屉运动e
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);