Android:当布局方向为RTL时,导航按钮显示错误的一面

时间:2015-08-12 11:15:42

标签: android navigation toolbar right-to-left

之前我问过这个问题(here),但是没有人回答,所以我问它有点简单。 问题是当我将布局方向更改为RTL时 (在 xml文件:android:layoutDirection="rtl" 或以编程方式:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
            getWindows().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
        }

无关紧要)导航图标保持LTR

enter image description here

如何解决此问题?

更具体地说,箭头应该指向右边!

8 个答案:

答案 0 :(得分:2)

我刚刚添加了一个旋转了180度的drawable图标,并在onCreate()中设置了图标,但问题是我们应该在每个布局为RTL的活动中执行此操作。因此,如果我们的应用程序支持两个方向,我们应检查布局方向是否为RTL,然后更改向上指示符:

if(config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_arrow_up_rtl);
}

答案 1 :(得分:2)

在活动类中 - > 添加以下行:

onCreate(){
    ActionBar ab = getSupportActionBar();    
    // Enable the Up button    
    ab.setDisplayHomeAsUpEnabled(true);
    ab.setBackgroundDrawable(getResources().getDrawable(R.drawable.ic_arrow_back_black_24dp, getApplicationContext().getTheme()));

    }
@Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent login = new Intent(LoginActivity.this, MainActivity.class);
        login.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(login);
    }

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        onBackPressed();
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}

使用文件编写自定义drawable - >新 - > VectorAsset https://developer.android.com/studio/write/vector-asset-studio.html 相应地选择箭头并启用字段 - >(启用RTL布局的自动镜像)

Auto-Mirror Property checked

我已将箭头的颜色更改为白色,您可以选择自己的颜色

FileName:可绘制文件夹中的ic_arrow_back_black_24dp.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:autoMirrored="true"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="#00000000"
        android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" />
</vector>

After changing the Locale to Arabic - which changes the entire Layout from RTL to LTR

答案 2 :(得分:1)

你可以使用:

getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_arrow_forward_24dp);

并将RTL箭头添加到drawable

答案 3 :(得分:1)

问题是因为箭头没有遵循应用程序的RTL情况

我遇到了同样的问题,最后我创建了一个自定义工具栏

使用NoActionBar主题并创建一个只有android.support.v7.widget.Toolbar的空

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:minHeight="?attr/actionBarSize"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary">
</android.support.v7.widget.Toolbar>

然后将其包含在需要工具栏的所有活动中

<include layout="@layout/toolbar"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />

并在活动中执行此操作

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if(toolbar != null) {
  setSupportActionBar(toolbar);
  toolbar.inflateMenu(R.menu.whatever);
}

自定义将遵循应用程序的RTL方向

答案 4 :(得分:0)

我和动画有同样的问题,我解决了!正如我注意到的,它是KitKat以下版本的错误(肯定高于4.2,包括)。 如你所说,你需要做的是在适当的位置旋转180度。

您必须根据Google提供的代码创建自己的ActionBarDrawerToggle。在里面你会找到类DrawerArrowDrawableToggle - 它是自定义Drawable,它绘制Arrow / Humberger“动画”。就像之前你必须创建自己的类一样,基于DrawerArrowDrawableToggle的代码,在里面你会发现变量“flipToPointRight”并注意它将是“正确的”并且你已经注意旋转不适用于版本&gt ; = Kitkat,否则会有问题。这就是全部。

答案 5 :(得分:0)

当使用 AppCompat支持库版本24或更高版本时,此错误仅在Android 4.2(API 17)上发生。

在以前的支持库版本中:

compile 'com.android.support:appcompat-v7:23.0.1'

...它是自动处理的,因为这个较旧的库包含左右两侧箭头的可绘制图像:

  • R.drawable.abc_ic_ab_back_mtrl_am_alpha (这是在AppCompat v23库中,drawabledrawable-ldrtl中有多个版本,...)

您可以在Android Studio中看到这些图片 - &gt;查看 - &gt;工具Windows - &gt;项目 - &gt;在下拉菜单中选择“项目” - &gt; appcompat-v7-23.0.1 - &gt; res - &gt; drawable - &gt; ...

在较新版本的AppCompat中,例如

compile 'com.android.support:appcompat-v7:24.0.0' // or anything above 23

箭头图像现在仅作为指向左侧的单个矢量drawable存在:

  • R.drawable.abc_ic_ab_back_material (AppCompat v24库中的矢量XML文件)

Android 4.2似乎无法在RTL模式的相反方向上镜像它。该库不包含后备图像。

因此,在不创建自己的自定义映像的情况下,修复它的一种可能方法是使用较旧的AppCompat支持库版本23或更低版本。但这可能与较新的工具/库不兼容。

答案 6 :(得分:0)

有一个称为auto mirror的属性,该属性本身会根据locale旋转图标。

如果您使用的是工具栏,并将图标添加为导航图标,请使用以下行旋转图标

toolbar.navigationIcon?.isAutoMirrored = true

如果您正在使用图像视图,则只需在图像视图中添加样式即可旋转图标。不要为阿拉伯语创建其他样式。 在样式文件中,添加以下代码:

<style name="ImageMirror">
    <item name="android:scaleX">-1</item>
</style>

选择矢量可绘制对象,因为它们默认具有此自动镜像属性。

答案 7 :(得分:0)

据我所知,所有 android studio 版本都会发生这种情况。幸运的是,解决方案比您想象的要容易。您只需要禁用 RTL 支持。只需转到您的清单文件并将此行中的值更改为 False:android:supportsRtl="true"。另一个好处是,该解决方案将解决在 RTL 语言(如阿拉伯语)中出现的大部分问题。希望这会有所帮助 (:

相关问题