2017-06-14 16 views
0

言語(英語とポルトガル語)を切り替えるオプションが1つの簡単な設定画面を追加したいアンドロイドアプリがあります。私はすでに適切な文字列リソースファイルを用意しています。Android N - ランタイムでのロケールの変更

システム環境設定でOSのメイン言語を変更してアプリケーションをリロードすると、その言語が使用されますが、設定画面で実行したいと考えています。

これまでのAndroidバージョンではこれがずっと簡単でしたが、そのコードは廃止されているので、すべてのアクティビティでattachBaseContextメソッドをオーバーライドしてコンテキストを再作成するというアプローチに従った私はこの記事に見られるように、ロケールは現在、環境設定で選択したロードするラッパー:プリファレンスを変更するときに私の理解にとても

Android N change language programatically

public class TCPreferenceActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 


@Override 
public void onBuildHeaders(List<Header> target) { 
    loadHeadersFromResource(R.xml.headers_preference, target); 
} 

@Override 
protected boolean isValidFragment(String fragmentName) { 
    return TCPreferenceFragment.class.getName().equals(fragmentName); 
} 


@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    if (key.equals("lang")) { 
     recreate(); 
    } 
} 



@Override 
protected void attachBaseContext(Context newBase) { 

    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(newBase); 

    String lang = pref.getString("lang", null); 

    Locale locale = new Locale(lang); 

    Context context = TCContextWrapper.wrap(newBase, locale); 
    super.attachBaseContext(context); 
} 

} 

は、onSharedPreferenceChangedメソッドが呼び出されます。そこでの活動を再現して、新しい文脈で再開できるようにします。

これは私のコンテキストラッパーです:私はのonChangeメソッドが呼び出されることがわかります

public class TCContextWrapper extends ContextWrapper { 

public TCContextWrapper(Context base) { 
    super(base); 
} 

public static ContextWrapper wrap(Context context, Locale newLocale) { 

    Resources res = context.getResources(); 
    Configuration configuration = res.getConfiguration(); 

    if (android.os.Build.VERSION.SDK_INT >= 24) { 
     configuration.setLocale(newLocale); 

     LocaleList localeList = new LocaleList(newLocale); 
     LocaleList.setDefault(localeList); 
     configuration.setLocales(localeList); 

     context = context.createConfigurationContext(configuration); 


    } else if (android.os.Build.VERSION.SDK_INT >= 17) { 
     configuration.setLocale(newLocale); 
     context = context.createConfigurationContext(configuration); 

    } else { 
     configuration.locale = newLocale; 
     res.updateConfiguration(configuration, res.getDisplayMetrics()); 
    } 

    return new ContextWrapper(context); 
} 

} 

デバッグ、好みの活動が再作成され、コンテキストラッパーが呼び出され、新しいロケールの値が正しくラッパーで作成されましたアクティビティが開始されると、私は同じデフォルト文字列を見続けます。

あなたがLocaleオブジェクトに対して設定されている

答えて

1

Language @parameterは、ドキュメントによると

An ISO 639 alpha-2 or alpha-3 language code, or a language subtag 
    * up to 8 characters in length. 

でなければなりません。 したがって、他のものを使用している場合は、アップデートするロケールは表示されません。

+0

それはまさにそれです。 –

関連する問題