操作栏菜单项图标在RTL时无法正确显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作栏菜单项图标在RTL时无法正确显示相关的知识,希望对你有一定的参考价值。

为了能够始终在菜单中的每个项目的文本旁边显示图标,我使用了这个approach,因为它是在线提到的为我工作的几个最简单的方法。结果如下:

public boolean onCreateOptionsMenu(Menu menu){
     MenuInflater inflater = getMenuInflater();
     inflater.inflate(R.menu.toolbar_menu,menu);

     if(menu instanceof MenuBuilder) {  //To display icon on overflow menu
          MenuBuilder m = (MenuBuilder) menu; 
          m.setOptionalIconsVisible(true);
     }

   return true;
}        

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/sign_out_menu"
        android:title="@string/logout"
        android:icon="@drawable/logout_black_24dp"
        app:showAsAction="never" />

    <item
        android:id="@+id/change_language_menu"
        android:title="@string/change_language"
        android:icon="@drawable/language_menu_24dp"
        app:showAsAction="never" />

</menu>

`enter image description here

那很完美!


问题是:当我将语言更改为RTL时!

它看起来像这样:enter image description here

图标被切断了!或者,如果你仔细观察,它们会转移到开始/右边......或者一切都转移到开始/右边!

我怎么解决这个问题?

答案

一个解决这个问题的简单技巧,直到有人提出更好的解决方案:

诀窍是改变矢量drawables的宽度和高度的值。

其中一个的例子是这样的:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:autoMirrored="true"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2 0,0.68 0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2 0,-0.68 0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2 0,0.68 -0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2 0,-0.68 -0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z" />
</vector>

对此:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="50dp"
    android:height="50dp"
    android:autoMirrored="true"
    android:viewportWidth="22.0"
    android:viewportHeight="22.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2 0,0.68 0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2 0,-0.68 0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2 0,0.68 -0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2 0,-0.68 -0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z" />
</vector>

我通过大量的试验和错误得到了价值,直到尺寸合理。并且两个图标使用不同的宽度和高度值以便正确调整。

结果如下:enter image description here

使用RTL:enter image description here

我还可以在string.xml中保存宽度和高度值,以便仅在语言更改时应用新维度。

虽然不完美!

以上是关于操作栏菜单项图标在RTL时无法正确显示的主要内容,如果未能解决你的问题,请参考以下文章

在android操作栏中的菜单项之间显示分隔符

在reactjs中显示菜单项后无法显示图标。

在Fragment上不调用onOptionsItemSelected()方法

如何在 Android 中显示和隐藏菜单项?

Android 如何从 Fragment 编辑操作栏菜单

带有操作栏图标单击的 NavigationUI 导致片段淡入淡出