前提・実現したいこと
Android4.4.4、5.1.1、7、8、9では問題なく動くのだが、Android4.1.2の端末GL07Sでは以下のエラーが発生し異常終了してしまうので、異常終了しないようにしたい。
TimePickerに対して端末設定言語と違う言語の設定について
試したこと
「Locale.UK」を「Locale.US」にしても異常終了します。
※言語として端末にUKはないがUSはあるのを確認しました。
「Locale.ENGLISH」でもダメでした。
また、「R.string.language_str」は「english」でも「japanese」でもダメです。
全て同じエラーで異常終了します。
発生している問題・エラーメッセージ
logcat
Caused by: java.lang.NullPointerException at android.view.ViewConfiguration.get(ViewConfiguration.java:343) at android.view.View.<init>(View.java:3243) at android.view.View.<init>(View.java:3307) at android.view.ViewGroup.<init>(ViewGroup.java:427) at android.widget.FrameLayout.<init>(FrameLayout.java:101) at android.widget.TimePicker.<init>(TimePicker.java:130) at com.a.b.CustomTimePicker.<init>(CustomTimePicker.java:26) at com.a.b.CustomTimePicker.<init>(CustomTimePicker.java:22)
該当のソースコード
※26行目と22行目のコメントは後付しました
java
1package com.a.b; 2 3import android.content.Context; 4import android.content.res.Configuration; 5import android.content.res.Resources; 6import android.os.Build; 7import android.support.annotation.Nullable; 8import android.support.v7.view.ContextThemeWrapper; 9import android.util.AttributeSet; 10import android.widget.TimePicker; 11 12import java.util.Locale; 13 14//stringsがenglishのときは英語設定用タイムピッカー 15public class CustomTimePicker extends TimePicker { 16 17 public CustomTimePicker(Context context) { 18 this(context, null); 19 } 20 21 public CustomTimePicker(Context context, @Nullable AttributeSet attrs) { 22//以下が22行目!! 23 this(context, attrs, Resources.getSystem().getIdentifier("timePickerStyle", "attr", "android")); 24 } 25 26 public CustomTimePicker(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 27//以下が26行目!! 28 super(new ContextLocaleWrapper(context, Locale.UK), attrs, defStyleAttr); 29 30 ((ContextLocaleWrapper) getContext()).resetDefaultLocale(); 31 } 32 33 private static class ContextLocaleWrapper extends ContextThemeWrapper { 34 35 @Nullable 36 private Locale defaultLocale = null; 37 38 private ContextLocaleWrapper(Context context, Locale locale) { 39 super(context, context.getTheme()); 40 41 Configuration configuration = new Configuration(context.getResources().getConfiguration()); 42 if(context.getString(R.string.language_str).equals("english") && Locale.getDefault().getLanguage().equals(Locale.ENGLISH.getLanguage()) == false){ 43 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 44 configuration.setLocale(locale); 45 configuration.setLayoutDirection(locale); 46 } else { 47 configuration.locale = locale; 48 } 49 } 50 applyOverrideConfiguration(configuration); 51 52 // N未満ではLocaleのデフォルト値を参照してしまうので対策 53 if(context.getString(R.string.language_str).equals("english") && Locale.getDefault().getLanguage().equals(Locale.ENGLISH.getLanguage()) == false){ 54 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N && !Locale.getDefault().equals(defaultLocale)) { 55 defaultLocale = Locale.getDefault(); 56 Locale.setDefault(locale); 57 } 58 } 59 } 60 61 public void resetDefaultLocale() { 62 // N未満で書き換えたLocaleのデフォルト値を元に戻す 63 if(getString(R.string.language_str).equals("english") && Locale.getDefault().getLanguage().equals(Locale.ENGLISH.getLanguage()) == false){ 64 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N && defaultLocale != null) { 65 Locale.setDefault(defaultLocale); 66 } 67 } 68 } 69 } 70}
補足情報(FW/ツールのバージョンなど)
Android Studio3.4
APIレベル14から28まで対象
回答2件
あなたの回答
tips
プレビュー