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 Library 或 AndroidX,您可以应用这个简单的修复:
- 在您的项目中,在
res -> layout
中使用此名称创建新的布局文件 abc_list_menu_item_icon.xml
。
将下面的代码复制到步骤 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>
在 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>
请帮我解决这个问题。
您必须为您的语言创建另一个文件夹
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 Library 或 AndroidX,您可以应用这个简单的修复:
- 在您的项目中,在
res -> layout
中使用此名称创建新的布局文件abc_list_menu_item_icon.xml
。 将下面的代码复制到步骤 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>