アプリ全体のレイアウトの方向をRTLに変更するにはどうすればよいですか?ユーザーが最初の起動時に言語を選択する必要があり、RTLへのユーザー選択に基づいてレイアウトを変更するか、LTRのままにするアプリを作成しています。以前はAndroid:supportsRtl="true"
をAndroidManifest
およびAndroid:layoutDirection="rtl"
各レイアウトについてですが、このアプローチには以下のような問題があります。
問題の1つは、方向をRTLに変更すると、ActionBar
ホームアイコンまたはナビゲーションボタン(ホームの起動が有効になっている場合)がLRTのままで、右に移動することです。
また、プログラムで方向を変えようとしましたが、結果は同じでした:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
getWindows().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
}
すべてのアクティビティを一度にRTLにすることを強制する方法はありますか、または各アクティビティで個別に方向を設定する必要がありますか?
アプリケーションのminSdk> = 17のときにこのコードを使用できます。
fa
にFarsi
を使用しましたが、他のrtl言語を使用できます。
Configuration configuration = getResources().getConfiguration();
configuration.setLayoutDirection(new Locale("fa"));
getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
アプリの言語を変更し、アクティブなレイアウトのビューとリソースの方向を変更する場合は、以下のコードを試してください。
// 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);
}
}
また、言語を変更した後、アクティブなレイアウトで既に作成されたビューの方向を変更する必要があります。このコードでこれを行うことができます:
if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL) {
view.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
} else {
view.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
}
レイアウト全体を変更する
LinearLayout linrtl=(LinearLayout)findViewById(R.id.linrtl);
linrtl.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
戻るボタンは、左向きの矢印であるリソースが1つしかないため、LTRモードのままです。 drawable-ldrtl-hdpiなどの新しいリソースフォルダーを指定し、このフォルダーに右向きの同じアイコンを配置する必要があります。
次のコードが機能します:
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);
}
ロケールはロケールのオブジェクトです
私もこの問題を抱えています。ビューの幅がMATCH_PARENT
に設定されている場合、[〜#〜] ltr [〜#〜]でGravity.LEFT
でビューの重力を設定する必要があります=モデルを作成し、RTLモデルのGravity.RIGHT
を使用してビューの重力を設定します。