Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android:gravity="right" not working on all devices for Arabic and other RTL languages

I've got an Arabic Android application, and here is the XML code:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/greygradientbackground">
<ImageView android:id="@+id/logo"
    android:layout_width="150dp"
    android:layout_height="fill_parent"
    android:scaleType="centerCrop"
    android:layout_margin="5dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true" />
<TextView android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="16sp"
    android:textColor="#000000"
    android:layout_gravity="center_vertical|right"
    android:gravity="right"
    android:layout_toLeftOf="@id/logo"/>
</RelativeLayout>

The problem is that android:gravity works on some Android models and on others don't.

To be more specific, I've tested the app on many 2.3.3 android devices and the Arabic text is aligned right. However on other 2.3.3 devices the Arabic text is aligned left (which is wrong).

When I changed android:gravity="right" to android:gravity="left" the problem shifted from the second group of devices to the first.

So my question is how can I solve this issue especially that as far as I know there aren't a way to localize layouts based on a device model number.

Thanks in advance for any guidance because am totally lost. :(

UPDATE:

I searched about "How to align Arabic correctly on all Android versions?" but found nothing working on all my testing devices. Any suggestions please? I am sure there is a best practice approach for aligning Arabic text on Android.

UPDATE 2:

I tried to use a WebView instead of a TextView to align Arabic correctly using CSS styles. However, the Arabic text is showing in the WebView as strange characters.

Here is the Code:

mWebView.loadData("<html  dir=\"rtl\">الأسم<body></body></html>", "text/html", "UTF-8");

The strange thing is that Arabic websites text is displayed correctly. So, what's the problem? :(

like image 403
M.ES Avatar asked Apr 16 '12 16:04

M.ES


People also ask

How to enable RTL Support in android?

First of all, you must add android:supportsRtl="true" to the <application> element in your manifest file for your app to supporting RTL design. Trick: If your app supports multiple languages and if you have code snippet like config. setLayoutDirection(Locale.US) you must change it.

What is the use of android gravity?

So in general android:layout_gravity attribute is used by child views to tell their parent how they want to be placed inside it, while android:gravity is used by the parent layout to tell the child views how they should be placed inside it.


1 Answers

This is an expected behaviour. You may not use gravity="right", but gravity="end" instead, the same idea you apply to gravity="left" which you may use gravity="start", as well as layout_marginStart instead of layout_marginLeft

This way, Android will put the text to the "start" orientation, depending on the location. (for us, americans, we start to write from the left and we end on the right, but arabians start from the right and end on the left).

You can get the layout/text directions with the method getLayoutDirectionFromLocale(null), this will return View.LAYOUT_DIRECTION_LTR (left-to-right) or View.LAYOUT_DIRECTION_RTL (right-to-left, like arabic).

More info you can check here

like image 131
Murillo Ferreira Avatar answered Sep 28 '22 12:09

Murillo Ferreira