Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android在Kotlin中编程应用语言的问题_Java_Android_Kotlin - Fatal编程技术网

Java Android在Kotlin中编程应用语言的问题

Java Android在Kotlin中编程应用语言的问题,java,android,kotlin,Java,Android,Kotlin,我让应用程序的语言可以被用户改变。所以,我在我的应用程序中添加了语言配置。我将微调器添加到配置屏幕中,微调器具有语言列表(自动、英语、中文等)。我将所选项目的位置保存在共享首选项中(默认值为0,自动)。在每个活动类中,我都添加了覆盖方法attachBaseContext(newBase:Context)。这段代码是我重写attachBaseContext的方式 override fun attachBaseContext(newBase: Context) { val shared =

我让应用程序的语言可以被用户改变。所以,我在我的应用程序中添加了语言配置。我将微调器添加到配置屏幕中,微调器具有语言列表(自动、英语、中文等)。我将所选项目的位置保存在共享首选项中(默认值为0,自动)。在每个活动类中,我都添加了覆盖方法attachBaseContext(newBase:Context)。这段代码是我重写attachBaseContext的方式

override fun attachBaseContext(newBase: Context) {
    val shared = newBase.getSharedPreferences("configuration",Context.MODE_PRIVATE)
    val position = shared?.getInt("Language",0) ?: 0

    super.attachBaseContext(LocaleManager.langChange(newBase,position)
这是LocaleManager

当我使用Java时,这种方法工作得很好。我认为将我的Android项目转换为Kotlin会很好,所以我首先转换了活动类。但由于某种原因,这种方式现在不起作用

我花了几个小时研究这个问题。 尝试了这些答案,但没有成功

(在扩展应用程序的类中设置区域设置)

(这与我的代码类似,但它使用LocaleList,而不是Locale)

但幸运的是,我尝试了这种方法,最终成功了

override fun attachBaseContext(newBase: Context) {
    val shared = newBase.getSharedPreferences(StaticStore.CONFIG, Context.MODE_PRIVATE)
    val lang = shared?.getInt("Language",0) ?: 0

    val config = Configuration() //Create new Configuration
    var language = StaticStore.lang[lang]

    if(language == "")
        language = Resources.getSystem().configuration.locales.get(0).toString()

    config.setLocale(Locale(language))
    applyOverrideConfiguration(config) //Manually override configuration using "config"

    super.attachBaseContext(LocaleManager.langChange(newBase,shared?.getInt("Language",0) ?: 0))
}
当我第一次打开特定活动时,它不会打印任何错误。 重新打开同一活动(如返回主屏幕并重新进入配置屏幕)会打印错误

2020-01-26 11:26:55.619 28216-28216/com.mandarin.myapp E/AppCompatDelegate: updateForNightMode. Calling applyOverrideConfiguration() failed with an exception. Will fall back to using Resources.updateConfiguration()
java.lang.IllegalStateException: Override configuration has already been set
    at android.view.ContextThemeWrapper.applyOverrideConfiguration(ContextThemeWrapper.java:99)
    at androidx.appcompat.app.AppCompatDelegateImpl.updateForNightMode(AppCompatDelegateImpl.java:2281)
    at androidx.appcompat.app.AppCompatDelegateImpl.applyDayNight(AppCompatDelegateImpl.java:2170)
    at androidx.appcompat.app.AppCompatDelegateImpl.attachBaseContext(AppCompatDelegateImpl.java:334)
    at androidx.appcompat.app.AppCompatActivity.attachBaseContext(AppCompatActivity.java:98)
    at com.mandarin.myapp.ConfigScreen.attachBaseContext(ConfigScreen.kt:371)
    at android.app.Activity.attach(Activity.java:6598)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2580)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
我理解此错误,但我必须使用applyOverrideConfiguration(配置)来解决区域设置问题。奇怪的是,即使这个错误被打印出来,应用程序也不会崩溃,但它让我非常不安

无论如何,由于这个错误,我尝试使用静态布尔值仅使用一次applyOverrideConfiguration(配置)。当我第一次打开活动时,它可以很好地改变语言。但当我重新打开同一活动时,它再次显示默认语言(英语是设备的语言)。所以这意味着只有applyOverrideConfiguration(配置)可以更改语言

事实上,当super.attachBaseContext(localemager.langChange(newBase,position))工作正常时,我不需要调用这个方法,但由于某些原因它不工作

有没有办法使用applyOverrideConfiguration而不出现打印错误?或者有没有办法解决不断变化的语言问题

override fun attachBaseContext(newBase: Context) {
    val shared = newBase.getSharedPreferences(StaticStore.CONFIG, Context.MODE_PRIVATE)
    val lang = shared?.getInt("Language",0) ?: 0

    val config = Configuration() //Create new Configuration
    var language = StaticStore.lang[lang]

    if(language == "")
        language = Resources.getSystem().configuration.locales.get(0).toString()

    config.setLocale(Locale(language))
    applyOverrideConfiguration(config) //Manually override configuration using "config"

    super.attachBaseContext(LocaleManager.langChange(newBase,shared?.getInt("Language",0) ?: 0))
}
2020-01-26 11:26:55.619 28216-28216/com.mandarin.myapp E/AppCompatDelegate: updateForNightMode. Calling applyOverrideConfiguration() failed with an exception. Will fall back to using Resources.updateConfiguration()
java.lang.IllegalStateException: Override configuration has already been set
    at android.view.ContextThemeWrapper.applyOverrideConfiguration(ContextThemeWrapper.java:99)
    at androidx.appcompat.app.AppCompatDelegateImpl.updateForNightMode(AppCompatDelegateImpl.java:2281)
    at androidx.appcompat.app.AppCompatDelegateImpl.applyDayNight(AppCompatDelegateImpl.java:2170)
    at androidx.appcompat.app.AppCompatDelegateImpl.attachBaseContext(AppCompatDelegateImpl.java:334)
    at androidx.appcompat.app.AppCompatActivity.attachBaseContext(AppCompatActivity.java:98)
    at com.mandarin.myapp.ConfigScreen.attachBaseContext(ConfigScreen.kt:371)
    at android.app.Activity.attach(Activity.java:6598)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2580)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)