web-dev-qa-db-ja.com

Android:プログラムでアプリ全体のレイアウト方向を変更する

アプリ全体のレイアウトの方向を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);
        }

enter image description here

すべてのアクティビティを一度にRTLにすることを強制する方法はありますか、または各アクティビティで個別に方向を設定する必要がありますか?

26

アプリケーションのminSdk> = 17のときにこのコードを使用できます。

faFarsiを使用しましたが、他のrtl言語を使用できます。

Configuration configuration = getResources().getConfiguration();
configuration.setLayoutDirection(new Locale("fa"));
getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
43
Afshin

アプリの言語を変更し、アクティブなレイアウトのビューとリソースの方向を変更する場合は、以下のコードを試してください。

// 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);
}
3
Pavel Kataykin

レイアウト全体を変更する

 LinearLayout linrtl=(LinearLayout)findViewById(R.id.linrtl);
 linrtl.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
2

戻るボタンは、左向きの矢印であるリソースが1つしかないため、LTRモードのままです。 drawable-ldrtl-hdpiなどの新しいリソースフォルダーを指定し、このフォルダーに右向きの同じアイコンを配置する必要があります。

0
box

次のコードが機能します:

    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);
    }

ロケールはロケールのオブジェクトです

0

私もこの問題を抱えています。ビューの幅がMATCH_PARENTに設定されている場合、[〜#〜] ltr [〜#〜]Gravity.LEFTでビューの重力を設定する必要があります=モデルを作成し、RTLモデルのGravity.RIGHTを使用してビューの重力を設定します。

0
SimK