🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1160閲覧

TimePickerに対して端末設定言語と違う言語の設定について

jun74

総合スコア338

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/07/30 01:05

前提・実現したいこと

TimePickerはAndroid端末に設定された言語に従って表示されるようですが、例えば韓国語と設定されている場合でも英語表記で表示したい場合、どのようにすれば良いでしょうか?
日本語以外の言語は全て英語としてリリースしたいアプリを開発しているための質問です。

試したこと

「TimePicker 言語固定」
「TimePicker 言語設定」
「TimePicker Language 設定」などで検索

補足情報(FW/ツールのバージョンなど)

Android Studio3.4
Android API14から28対象

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

AndroidのViewはContextが保持している Configuration というクラスからLocaleの設定を読み込んでいます。このLocaleを変更した状態のContextを生成し、TimePickerの生成時に渡すようにすればOKです。

追記: Android N未満ではLocale.getDefault()の値を書き換える必要があったので、それに対する対策コードも追記しました。TimePickerの代わりにCustomLocaleTimePickerをxml内に埋め込む等して利用してください。

java

1public class CustomLocaleTimePicker extends TimePicker { 2 3 public CustomLocaleTimePicker(Context context) { 4 this(context, null); 5 } 6 7 public CustomLocaleTimePicker(Context context, @Nullable AttributeSet attrs) { 8 this(context, attrs, Resources.getSystem().getIdentifier("timePickerStyle", "attr", "android")); 9 } 10 11 public CustomLocaleTimePicker(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 12 super(new ContextLocaleWrapper(context, Locale.US), attrs, defStyleAttr); 13 14 ((ContextLocaleWrapper) getContext()).resetDefaultLocale(); 15 } 16 17 private static class ContextLocaleWrapper extends ContextThemeWrapper { 18 19 @Nullable 20 private Locale defaultLocale = null; 21 22 private ContextLocaleWrapper(Context context, Locale locale) { 23 super(context, context.getTheme()); 24 25 Configuration configuration = new Configuration(context.getResources().getConfiguration()); 26 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 27 configuration.setLocale(locale); 28 configuration.setLayoutDirection(locale); 29 } else { 30 configuration.locale = locale; 31 } 32 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 33 applyOverrideConfiguration(configuration); 34 } 35 36 // N未満ではLocaleのデフォルト値を参照してしまうので対策 37 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N && !Locale.getDefault().equals(defaultLocale)) { 38 defaultLocale = Locale.getDefault(); 39 Locale.setDefault(locale); 40 } 41 } 42 43 public void resetDefaultLocale() { 44 // N未満で書き換えたLocaleのデフォルト値を元に戻す 45 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N && defaultLocale != null) { 46 Locale.setDefault(defaultLocale); 47 } 48 } 49 } 50}

投稿2019/07/30 08:45

編集2019/11/25 23:56
kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun74

2019/07/30 13:01 編集

ご回答頂きありがとうございます。 初心者で申し訳ありません。 以下のtm_pickerとの関連付け方が分からなく教えて頂ければ有り難いです。 ```java TimePicker tm_picker = layout.findViewById(R.id.tm_picker); tm_picker.setIs24HourView(false); ``` 前に new TimePicker(getContextForLocale(context, Locale.US)); を書いても駄目で、どのように記述すれば良いか、、申し訳ありません。
jun74

2019/07/30 14:28 編集

Android8では、TimePicker tm_picker = layout.findViewById(R.id.tm_picker);を含むアラートダイアログの処理の中では駄目でしたが、ActivityのonResume()の中にnew TimePicker(getContextForLocale(context, Locale.US));を書けば意図した動作になりました。 しかし、Android4.4.4(API 19)、Android5.1.1(API 22)ではダメでした。。 とりあえず、端末設定が日本語に対してテストしたところ、Android8は「1:20 AM」という正しい表記、 Android5.1.1では「AM 0:20」という順番がおかしく、時間に0時が存在するというおかしな表記、 Android4.4.4では「午前0:20」と日本語表記のままとなってしまいました。 何度もコメント更新して、申し訳ありません。
kakajika

2019/07/31 03:21

> しかし、Android4.4.4(API 19)、Android5.1.1(API 22)ではダメでした。。 失礼しました。TimePickerの実装を辿ってみたところ、古いバージョンのAndroidではLocale.getDefault()の値を参照していたようです。なのでちょっとしたハックになりますが、いったんLocale.setDefault(...)で値を変更してその後適当なタイミングで戻す処理が必要になります。 > 以下のtm_pickerとの関連付け方が分からなく教えて頂ければ有り難いです。 xml内で利用するのでしたら、TimePickerを継承した独自クラスを作成してそれを代わりに埋め込んでしまうのが楽です。上記の問題に対する修正も含めて回答を編集しますね。(すべてのバージョンのAndroidに対応できているかはちょっと自信がないので、もし問題がありましたらお知らせください。)
jun74

2019/07/31 13:23 編集

デバッグで以下のエラーが出て、黒い画面でアラートダイアログの呼び元の画面に戻ります。 CustomTimePickerと名前変更して組み込みました。 なお、以下の「View layout = inflater.inflate(R.layout.time_dialog, (ViewGroup) findViewById(R.id.time_layout));」 この行から先に進まずなので、この行で異常終了しています。 以下、エラーメッセージ E/AndroidRuntime: FATAL EXCEPTION: main Process: com.a.b, PID: 4424 android.view.InflateException: Binary XML file line #7: Binary XML file line #7: Error inflating class CustomTimePicker Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class CustomTimePicker Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.CustomTimePicker" on path: DexPathList[[zip file 以下アラートダイアログのxml <CustomTimePicker android:id="@+id/tm_picker" android:timePickerMode="spinner" android:theme="@style/PickerText" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 以下java // カスタムビューを設定 LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.time_dialog, (ViewGroup) findViewById(R.id.time_layout)); ・・・ CustomTimePicker tm_picker = layout.findViewById(R.id.tm_picker); 以下CustomTimePicker.java public class CustomTimePicker extends TimePicker {
jun74

2019/07/31 15:46 編集

初歩的な所ばかりで申し訳ありません。。 上記の通りにして動きましたが、Android8でTimePickerが今までとは違う感じで変になりました。 1:20 PMで表示内容は英語なのですが、 それまで適用されていた「android:theme="@style/PickerText"」が適用されなくなり、 線も数字も全て黒で、一番おかしいのが「AM、PM」がグレーのボタンみたいになり、押したらボタンの表示がAM、PMで切り替わるようなものに変化しました。 Android4、5でも同じで、時分の間のコロンがなく、ボタンはグレー。ドラムロールは良い感じの色ですが、指定のスタイルにはなりません。
kakajika

2019/07/31 15:49

またまた失礼しました。。styleやThemeについての実装が抜けていました。 回答を修正しておきますので、ご確認ください。
jun74

2019/07/31 16:26

ここまで丁寧にご回答頂きありがとうございました! Android4.4.4、5.1.1、8の3機種で英語表記でスタイル、テーマも、ちゃんと出力されました! 明日以降、日本語は日本語の判定を入れて、色々テストして動かしてみたいと思います。 最終的にTimePickerとしての全ての動作確認してから解決済みにしたいと考えますので、よろしくお願いいたします。
jun74

2019/08/01 14:21

申し訳ありません。また初歩的なことなのですが。。 CustomLocaleTimePickerの中で if(getString(R.string.language_str).equals("japanese")==false){ としたいのですが、「getString」が構文エラーとなります。 R.string.language_strを取得するには、どのように記述すれば良いのでしょうか?
jun74

2019/08/01 14:31

context.getStringで上手く行きました。 お騒がせしました。続きのテスト実施します。
jun74

2019/08/01 15:38

パソコンのスペック不足でエミュレータもまともに動かず、Android4.4.4より前の端末を持っていないので一部テスト出来てないのが悔やまれますが、Android4.4.4、5.1.1、8の3機種でapk作成してインストールしテストしましたが、無事想定通りの動きであることを確認できました! 本当にありがとうございました。
kakajika

2019/08/02 11:46

それは何よりです!ご報告ありがとうございます。一応手元のGenymotionで4.1環境を作って試してみましたが、無事に動いていそうです。 それと、static変数にLocaleのデフォルト値を退避させるコードが気持ち悪かったので回答を少し修正しました。
jun74

2019/08/02 13:40

4.1環境での確認ありがとうございます。大変助かります。 こちらも修正版のソースに書き換えて、4.4.4、5.1.1、8の確認完了しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問