MenuItem 图标在 RTL 布局中未正确显示

MenuItem icon is not displaying correctly in RTL Layouts

在 RTL 中,选项菜单项图标显示不正确!! 但是在LTR里,一切都展现的很好很漂亮

借助这个命令,我制作了RTL程序

getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

我的菜单layout.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:gravity="start"
    android:layoutDirection="rtl"
    android:layout_gravity="start">
    <item
        android:id="@+id/action_more"
        android:icon="@drawable/ic_add_white_24dp"
        android:title=""
        app:showAsAction="always">
        <menu>
            <item
                android:id="@+id/action_settings"
                android:icon="@drawable/ic_wb_sunny_black_24dp"
                android:title="آیتم شماره 1"/>

            <item
                android:id="@+id/action_settings2"
                android:icon="@drawable/ic_star_black_24dp"
                android:title="آیتم شماره 2"/>

            <item
                android:id="@+id/action_settings3"
                android:icon="@drawable/ic_wb_sunny_black_24dp"
                android:title="آیتم شماره 3"/>
        </menu>
    </item>
</menu>

请帮我解决这个问题。

Screenshot

您必须为您的语言创建另一个文件夹

ex : layout-ar 阿拉伯语

自定义工具栏弹出主题,覆盖

android:layout_marginStart android:layout_marginEnd

首先将此行添加到您的 res/values/styles。xml

<style name="PopupTheme" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:layout_marginStart">2dp</item>
    <item name="android:layout_marginEnd">2dp</item>
</style>

然后如上图设置Toolbar的popupTheme为'PopupTheme',就这样:

......
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    app:navigationIcon="@drawable/arrow_back"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/PopupTheme"
    app:title="@string/toolbar_title"/>
......

干杯!

我在 RTL 布局中遇到了同样的问题,如果您使用的是 Support LibraryAndroidX,您可以应用这个简单的修复:

  1. 在您的项目中,在 res -> layout 中使用此名称创建新的布局文件 abc_list_menu_item_icon.xml
  2. 将下面的代码复制到步骤 1 中的文件中。

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Copyright (C) 2007 The Android Open Source Project
    
         Licensed under the Apache License, Version 2.0 (the "License");
         you may not use this file except in compliance with the License.
         You may obtain a copy of the License at
    
              http://www.apache.org/licenses/LICENSE-2.0
    
         Unless required by applicable law or agreed to in writing, software
         distributed under the License is distributed on an "AS IS" BASIS,
         WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         See the License for the specific language governing permissions and
         limitations under the License.
    -->
    
    <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
               android:id="@+id/icon"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_gravity="center_vertical"
               android:layout_marginLeft="8dip"
               android:layout_marginRight="-8dip"
               android:layout_marginStart="8dip"
               android:layout_marginEnd="-8dip"
               android:layout_marginTop="8dip"
               android:layout_marginBottom="8dip"
               android:scaleType="centerInside"
               android:duplicateParentState="true"/>
    

此修复程序在 appcompat:1.3.0-alpha02

中可用

在更新日志中:

在带有图标的菜单项中支持 RTL (I2f5c5): https://android-review.googlesource.com/c/platform/frameworks/support/+/1353122

据我所知,您使用的是 vector/xml 可绘制对象(即不是 png),在这种情况下,您可以使用 inset,特别是 android:insetRight 属性

您可以将此应用到所有可绘制对象:(ic_wb_sunny_black_24dp、ic_star_black_24dp、&ic_wb_sunny_black_24dp)

矢量图示例:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetRight="16dp">
    <vector
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24"
        android:viewportHeight="24"
        app:tint="@color/item_text">
        <path
            android:fillColor="@color/item_text"
            android:pathData="M22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2A10,10 0 0,1 22,12M7.4,15.4L12,10.8L16.6,15.4L18,14L12,8L6,14L7.4,15.4Z" />
    </vector>
</inset>

xml 可绘制对象的示例:

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetRight="16dp">

    <shape android:shape="oval">

        <solid android:color="@color/highlight_1" />
        <stroke
            android:width="2dp"
            android:color="@color/transparent" />
        <size
            android:width="30dp"
            android:height="30dp" />
    </shape>

</inset>