Androidアプリ開発

デフォルト言語以外のリソースを
ハンドリングする

この記事は約10分で読めます。
スポンサーリンク

こんにちは、まっさん(@Tera_Msaki)です。

この記事はAndroidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Javaでの開発経験、XML構文規則、Androidのアプリ開発経験がある方を対象としています。
Androidのアプリ開発でお役にたててれば、嬉しいです。
(これからAndroidのアプリ開発やJavaでの開発を始めたい方への案内は、記事の最後で紹介します)

愛用品をご紹介♪
材質や厚みによって、熱の入り方が変わります。
このフライパンを使うと、
熱の入り方が違うことが、調理した料理の味で実感できます。
油慣らしと調理前の油返しが必要ですが、
育てる鉄フライパンは一生モノです♪

◎テーマ
スマホに設定しているデフォルト言語以外の言語リソースファイルをハンドリングする。

◎ポイント

Andoridアプリの開発で、
多言語対応する場合、言語毎にリソースファイルを作成すると思います。
スマホに設定された言語(
デフォルト言語)に応じて、
リソースを選択してくれますが、
デフォルト言語以外の言語リソースにアクセスできません。
デフォルト言語以外の言語リソースにアクセスするためには、
アクセスしたい言語で
コンテキストを生成し、
生成したコンテキストからリソースファイルにアクセスすることで、
デフォルト言語以外のリソースをハンドリングすることが可能になります。

デフォルト言語を英語にしたGPSログ走行記録アプリ(Archive)の画面です。

走行データの一覧に英語表記(Date、Speed、Record)と
日本語表記(日付、最高速、記録)が混在しています。
一覧の表示で区切り文字(デリミタ)を使用して、
文字列を分解していますが、
デフォルト言語が日本語の場合に、
文字列に英語表記があると分解が上手く機能しません。

◎指定した言語でコンテキストを生成する

    :
    // 他言語リソース取得 //
    public Context createLocalizedContext(Locale locale) {
        Configuration configuration = new Configuration(getResources().getConfiguration());
        configuration.setLocales(new LocaleList(locale));
        return createConfigurationContext(configuration);
    }
    :

◎言語リソースファイル(strings.xml)

  : 
    <string name="delimiter1">Date:</string>
    <string name="delimiter2">Speed:</string>
    :

◎言語リソースファイル(strings.xml( ja ))

  : 
    <string name="delimiter1">日付:</string>
    <string name="delimiter2">最高速:</string>
    :

アプリケーション自体のデフォルト言語を英語( en )にして、
日本語( ja )の言語リソースファイルを追加しています。
これはスマホ本体のデフォルト言語が日本語の場合は、
言語リソースを日本語を選択させ、
日本語以外の場合に英語を選択させるためです。

◎デフォルト言語以外のリソースをハンドリング

デフォルト言語のデリミタを使用して文字列を分解して、
分解できない場合に別の言語リソースのデリミタを使用して、
文字列を分解しています。

        :
            @Override
            public void onBindView(View view, Object data, int position) {
                TextView textView = view.findViewById(R.id.text_item);
                String[] string = {"", "", ""};
                string[0] = motionList.get(position).getTitle().substring(0, Math.max(motionList.get(position).getTitle().indexOf(getString(R.string.delimiter1)), 0));
                if (string[0].length() > 0) {
                    string[1] = motionList.get(position).getTitle().substring(Math.max(motionList.get(position).getTitle().indexOf(getString(R.string.delimiter1)), 0),
                            Math.max(motionList.get(position).getTitle().indexOf(getString(R.string.delimiter2)), 0));
                    string[2] = motionList.get(position).getTitle().substring(Math.max(motionList.get(position).getTitle().indexOf(getString(R.string.delimiter2)), 0));
                } else {
                    Context local = createLocalizedContext(new Locale(Locale.getDefault().getLanguage().equals("ja") ? "en" : "ja"));
                    string[0] = motionList.get(position).getTitle().substring(0, Math.max(motionList.get(position).getTitle().indexOf(local.getString(R.string.delimiter1)), 0));
                    string[1] = motionList.get(position).getTitle().substring(Math.max(motionList.get(position).getTitle().indexOf(local.getString(R.string.delimiter1)), 0),
                            Math.max(motionList.get(position).getTitle().indexOf(local.getString(R.string.delimiter2)), 0));
                    string[2] = motionList.get(position).getTitle().substring(Math.max(motionList.get(position).getTitle().indexOf(local.getString(R.string.delimiter2)), 0));
                }
                textView.setText(HtmlCompat.fromHtml(String.format("<b><u><big>%s</big></u></b><br>%s<br>%s", string[0], string[1], string[2]), FROM_HTML_MODE_COMPACT));
            }
        :

ブログランキング・にほんブログ村へ

◎これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

初めてのAndroidのアプリ開発では、アプリケーション開発経験がない方や、
アプリケーション開発経験がある方でも、JavaやC#などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。

コメント欄

タイトルとURLをコピーしました