How can I change entire app layout direction to RTL?
I am writing an app that user must select it's language in first launch and the layout should change based on user selection to RTL or remains LTR.
I used to add android:supportsRtl="true"
to the AndroidManifest
and android:layoutDirection="rtl"
for each layout but this approach have some problems like below :
One problem is when I change the direction to RTL the ActionBar
home icon or navigation button (when home as up is enabled) remains LRT and just move to the right.
I also tried to change direction programmatically and the result was the same :
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
getWindows().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
}
Is there any way to force all activities to become RTL at once or we should set direction in each activity separately?
You can use this piece of code while your application's minSdk >= 17.
I used fa
for Farsi
, you can use other rtl language.
Configuration configuration = getResources().getConfiguration();
configuration.setLayoutDirection(new Locale("fa"));
getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
Try code below if you want to change language in the app and change directions in views and resources on active layout:
// set Persian language in the app
setLanguage(context, "fa");
public void setLanguage(Context c, String lang) {
Locale localeNew = new Locale(lang);
Locale.setDefault(localeNew);
Resources res = c.getResources();
Configuration newConfig = new Configuration(res.getConfiguration());
newConfig.locale = localeNew;
newConfig.setLayoutDirection(localeNew);
res.updateConfiguration(newConfig, res.getDisplayMetrics());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
newConfig.setLocale(localeNew);
c.createConfigurationContext(newConfig);
}
}
Also, after changing the language, you need to change the directions for the already created views on the active layout. You can do this with this code:
if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL) {
view.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
} else {
view.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
}
Change the whole layout
LinearLayout linrtl=(LinearLayout)findViewById(R.id.linrtl);
linrtl.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
The back button stays in LTR mode, because it only has one resource, which is an arrow pointing to the left. You need to specify a new resource folder e.g drawable-ldrtl-hdpi and put the same icon which is pointing right in this folder.
I also have this problem, i find that if your view's width set MATCH_PARENT
, you should set the view's gravity with Gravity.LEFT
in LTR model and set the view's gravity with Gravity.RIGHT
in RTL model.
Following code will work:
Resources your_resource = context.getResources();
Configuration config = your_resource.getConfiguration();
config.locale = locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
config.setLayoutDirection(locale);
}
where locale is object of Locale
来源:https://stackoverflow.com/questions/31904627/android-change-entire-app-layout-directions-programmatically