之前我问过这个问题(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
如何解决此问题?
更具体地说,箭头应该指向右边!
答案 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布局的自动镜像)
我已将箭头的颜色更改为白色,您可以选择自己的颜色
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'
...它是自动处理的,因为这个较旧的库包含左右两侧箭头的可绘制图像:
drawable
和drawable-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存在:
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 语言(如阿拉伯语)中出现的大部分问题。希望这会有所帮助 (: