问题
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?
回答1:
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());
回答2:
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);
}
回答3:
Change the whole layout
LinearLayout linrtl=(LinearLayout)findViewById(R.id.linrtl);
linrtl.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
回答4:
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.
回答5:
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.
回答6:
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