Skip to content
Reborn edited this page Aug 5, 2020 · 2 revisions

Welcome to the Plugin-Locale-Kotlin wiki!

注意事项

SharePreferenceslanguage字段的value与 App 语言的对应关系

对应关系如下:

V1.0.10+

新版本兼容获取旧版本的值,但是设置的时候会重新set新的值,放心,绝对平稳过渡

新版本对应关系需要自己定义(必须做这一步!!!),这样就可以自己定义支持什么语言了,举例:

private fun getLocale(which : String): Locale {
    return when (which) {
        "0" -> Locale.ROOT  // 跟随系统
        "1" -> Locale.ENGLISH
        "2" -> Locale.SIMPLIFIED_CHINESE
        "3" -> Locale.TRADITIONAL_CHINESE
        else -> Locale.SIMPLIFIED_CHINESE
    }
}

然后再一句代码调用切换语言:

// 应用切换的语言
LocaleHelper.getInstance()
    .language(getLocale(which.toString()))
    .apply(this)

说明:通常,which为语言列表的第几项。当然,你也可以不定义0/1/2/3,你可以定义auto/en/zh_cn/zh_tw注意:若要做跟随系统,此项对应关系的value必须为Locale.ROOT

更多用法

自定义切换语言后刷新界面的方式

自定义切换语言后刷新界面的方式

初始化

LocalePlugin.init(this, { 刷新界面的方式 })

首先,下面是几个初始化刷新界面方式的常量:

LocaleConstant.RESTART_TO_LAUNCHER_ACTIVITY -> 重启到主页非重启 AppLocaleConstant.RECREATE_CURRENT_ACTIVITY -> 重启已经打开的 Activity
LocaleConstant.CUSTOM_WAY_TO_UPDATE_INTERFACE -> 自己实现刷新界面的方式

LocaleConstant.RESTART_TO_LAUNCHER_ACTIVITY

该方式会清空栈中所有Activity并重启到LauncherActivity

{ 刷新界面的方式 }选择了第一种LocaleConstant.RESTART_TO_LAUNCHER_ACTIVITY,请使用下面的方式:

```java
// 应用切换的语言
val intent = Intent(this, TargetActivity::class.java)
LocaleHelper.getInstance()
    .language(getLocale(which.toString()))
    .apply(this, intent)
```

LocaleConstant.RECREATE_CURRENT_ACTIVITY

该方式会重新创建当前Activity默认是这种方式,可不填写

此方式可能会因为内存低无法注销广播接收器而导致内存泄漏,解决方法请查看👉常见问题

LocaleConstant.CUSTOM_WAY_TO_UPDATE_INTERFACE

该方式可自己实现自定义刷新界面方式,需要使用前先在Application初始化插件:

LocalePlugin.init(this, LocaleConstant.CUSTOM_WAY_TO_UPDATE_INTERFACE)

初始化过后,在切换语言的界面实现ActivityHelper.OnUpdateInterfaceListener接口、设置监听器,然后在接口方法体内写自己想要实现的刷新界面逻辑,如:

class SettingActivity : AppCompatActivity(), ActivityHelper.OnUpdateInterfaceListener {

    @SuppressLint("StringFormatInvalid")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_settings)
        ...
        // 设置监听器
        ActivityHelper.getInstance().setOnUpdateInterfaceListener(this)
    }

    override fun updateInterface(context: Context, intent: Intent?) {
        // TODO: To write your way to update interface
        Toast.makeText(context, intent?.getStringExtra("Test"), Toast.LENGTH_LONG).show()
    }
}

然后在切换语言的时候调用:

// 应用切换的语言
LocaleHelper.getInstance()
    .language(which.toString())
    .apply(this@SettingActivity, intent, ActivityUtil)

举例:

val intent = Intent(this, MainActivity::class.java)
intent.putExtra("Test", getString(R.string.activity_custom_refresh_way_test))
LocaleHelper.getInstance()
    .language(which.toString())
    .apply(this@SettingActivity, intent, ActivityUtil)

常见问题

切换语言失效原因及解决方法

AndroidX AppCompat 库 1.1.0-alpha03 以上版本导致的 Locale 被一个新的 Configuration 对象覆盖掉

AndroidX AppCompat 库 1.1.0-alpha03 以上版本导致的 Locale 被一个新的 Configuration 对象覆盖掉

仅写出解决方法,本demo经测试无法复现问题

Activity中加入以下代码即可:

// 防止 Locale 被一个新的 Configuration 对象覆盖掉(AndroidX AppCompat 库 1.1.0-alpha03 以上版本)
override fun applyOverrideConfiguration(overrideConfiguration: Configuration?) {
    overrideConfiguration?.setLocale(LocaleHelper.getInstance().getSetLocale())
    super.applyOverrideConfiguration(overrideConfiguration)
}

内存泄漏原因及解决方法

Activity 对象被回收时还没来得及执行 onDestroy() 方法导致没注销对应的广播接收器引发的内存泄漏

Activity 对象被回收时还没来得及执行 onDestroy() 方法导致没注销对应的广播接收器引发的内存泄漏

这种情况常见于内存低的时候Activity被强制回收,不走onDestroy()方法导致的。

遇到这种情况的朋友请自行判断内存低即将回收Activity的地方(onTrimMemory()?),

然后手动调用以下代码注销广播接收器:

BroadcastReceiverManager.unregisterBroadcastReceiver(activity)