0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[ Android ] [ localization ] 言語切替4

Last updated at Posted at 2019-11-08

今回も言語切替について記す。

前回記事でほとんど綴っているので、ポイントのプログラムのみ解説する。
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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?