在 MainActivity 中更改区域设置有效,但在 Fragment 中更改它会给出 Nullpointerexception
Changing locale in MainActivity works, but changing it in Fragment gives Nullpointerexception
我有一个 ListPreference
,我想用它来更改我的应用程序的语言。
<ListPreference
android:key="@string/language_preference"
android:title="@string/preference_title"
android:entries="@array/language_array"
android:entryValues="@array/language_data"
app:iconSpaceReserved="false" />
我正在使用 this 本地化库来提供帮助。在我的 MainActivity
中,我有两个函数可以更改(当前)两种支持的语言:
fun changeLanguageGer() {
setLanguage("de")
}
fun changeLanguageEn() {
setLanguage("en")
}
我的 MainActivity
中碰巧有一个微调器,我“误用”它来检查这些方法是否有效:当更改为相应的微调器项时,我的应用程序语言会按预期更改。
但实际上我想通过 ListPreference
在我的设置中进行此更改。
在SettingsFragment
中我有以下代码:
class SettingsActivity : LocalizationActivity() {
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.root_preferences, rootKey)
...
// language
val listPreference =
findPreference<Preference>(getString(R.string.language_preference)) as ListPreference?
listPreference?.setOnPreferenceChangeListener { preference, newValue ->
if (preference is ListPreference) {
val index = preference.findIndexOfValue(newValue.toString())
val locale = preference.entryValues[index]
if (locale == "de") {
Toast.makeText(activity,locale, Toast.LENGTH_LONG).show()
MainActivity().changeLanguageGer()
}
if (locale == "en") {
Toast.makeText(activity,locale, Toast.LENGTH_LONG).show()
MainActivity().changeLanguageEn()
}
}
true
}
}
}
}
这给了我以下 Nullpointerexception:java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference
。我添加了 toast 语句以确保在单击要更改为的语言时得到的输出是正确的(给我“de”或“en”)。
我将如何调试它?
(activity as SettingsActivity).changeLanguageEn()
尝试使用它来更改语言。
我有一个 ListPreference
,我想用它来更改我的应用程序的语言。
<ListPreference
android:key="@string/language_preference"
android:title="@string/preference_title"
android:entries="@array/language_array"
android:entryValues="@array/language_data"
app:iconSpaceReserved="false" />
我正在使用 this 本地化库来提供帮助。在我的 MainActivity
中,我有两个函数可以更改(当前)两种支持的语言:
fun changeLanguageGer() {
setLanguage("de")
}
fun changeLanguageEn() {
setLanguage("en")
}
我的 MainActivity
中碰巧有一个微调器,我“误用”它来检查这些方法是否有效:当更改为相应的微调器项时,我的应用程序语言会按预期更改。
但实际上我想通过 ListPreference
在我的设置中进行此更改。
在SettingsFragment
中我有以下代码:
class SettingsActivity : LocalizationActivity() {
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.root_preferences, rootKey)
...
// language
val listPreference =
findPreference<Preference>(getString(R.string.language_preference)) as ListPreference?
listPreference?.setOnPreferenceChangeListener { preference, newValue ->
if (preference is ListPreference) {
val index = preference.findIndexOfValue(newValue.toString())
val locale = preference.entryValues[index]
if (locale == "de") {
Toast.makeText(activity,locale, Toast.LENGTH_LONG).show()
MainActivity().changeLanguageGer()
}
if (locale == "en") {
Toast.makeText(activity,locale, Toast.LENGTH_LONG).show()
MainActivity().changeLanguageEn()
}
}
true
}
}
}
}
这给了我以下 Nullpointerexception:java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference
。我添加了 toast 语句以确保在单击要更改为的语言时得到的输出是正确的(给我“de”或“en”)。
我将如何调试它?
(activity as SettingsActivity).changeLanguageEn()
尝试使用它来更改语言。