在mainactivity中更改java语言环境是可行的,但在片段中更改它会导致nullpointerexception

ljo96ir5  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(517)

我有一个 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" />

我用这个本地化库来帮助你。在我的 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”)。
我该如何调试这个呢?

niwlg2el

niwlg2el1#

(activity as SettingsActivity).changeLanguageEn()

试着用这个来改变语言。

相关问题