今回も言語切替について記す。
前回記事でほとんど綴っているので、ポイントのプログラムのみ解説する。
https://qiita.com/QiitaD/items/e26287727e067cd98a1f
##initialize()
以下のようなプログラムを前回のプログラムに加えることで、表示切替ができる。
(変数名は変えているので注意していただきたい)
button.setOnClickListener((View view1)->{
Context context2 = MyContextWrapper.wrap(newBase2, newLocale);
//付け加え
if (isLocaleJp(context2)){
newLocale = Locale.ENGLISH;
textView2.setText("こんに");
button.setText("英語表示");
} else {
newLocale = Locale.JAPAN;
textView2.setText("He");
button.setText("in Japanese");
}
});
動作としては目標を達成できたが、
私が作りたかったものはOSの言語を切替え、それに伴い表示を切替えるプログラムである。
上記ではvalues-jaフォルダやMyContextWrapperの存在価値が無くなっている。
作りたいプログラムは作れなかったが、試行錯誤の結果を下に記す。
##試したこと
前回のMainActivity.javaを少し弄ったファイルを見て頂きたい。
public class MainActivity extends AppCompatActivity {
static MainActivity mainActivity;
Context newBase2 = null;
Locale newLocale = Locale.ENGLISH;
Locale locale2 = null;
//ロケール初期化、onCreateより前に一度だけ呼び出せる
@Override
protected void attachBaseContext(Context newBase) {
//省略
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainActivity = this;
// newBase2 = MainActivity.mainActivity.getApplicationContext();
setContentView(R.layout.activity_main);
initialize();
}
//onCreate内から呼び出される
private void initialize() {
Button button = findViewById(R.id.button);
TextView textView2 = findViewById(R.id.textView2);
button.setOnClickListener((View view1)->{
Context context2 = MyContextWrapper.wrap(newBase2, newLocale);
if (isLocaleJp(context2)){
newLocale = Locale.ENGLISH;
textView2.setText("こんに");
// button.setText("英語表示");
} else {
newLocale = Locale.JAPAN;
textView2.setText("He");
// button.setText("in Japanese");
}
});
}
//initialize()内から呼び出される、contextが日本語か判定
static boolean isLocaleJp(Context context){
//省略
}
}
attachBaseContext()はLocaleを英語に初期化する。
私のエミュレータは日本語に設定してあり、このメソッドにより英語の表示に切り替わっている。
このメソッドをコメントアウトすると日本語表示になるので、うまくいっていると言える。
しかし、initialize()でも同様にMyContextWrapperクラスのwrap()を呼び出しても、
表示を切り替えることができなかった。
この対策としてManifestに以下を追加してみたが変わらなかった。
<application
android:configChanges="locale"/>
また**onConfigurationChanged(Configuration newConfig)**をオーバーライドして使ってみたが、依然うまくいかなかった。
まだ結論は出ていないが、SharedPreferencesを使った実装ならできるかもしれない。
以下がその参考になりそうだ。
・基本的な使い方
https://qiita.com/YAmi/items/3e5640f365277d70f255
・実装方法例
https://juejin.im/post/5ac8d62c518825557e78a514