-
Notifications
You must be signed in to change notification settings - Fork 6
Home
Reborn edited this page Aug 5, 2020
·
2 revisions
Welcome to the Plugin-Locale-Kotlin wiki!
对应关系如下:
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 -> 重启到主页(非重启 App )
LocaleConstant.RECREATE_CURRENT_ACTIVITY -> 重启已经打开的 Activity
LocaleConstant.CUSTOM_WAY_TO_UPDATE_INTERFACE -> 自己实现刷新界面的方式
该方式会清空栈中所有Activity
并重启到LauncherActivity
若{ 刷新界面的方式 }
选择了第一种LocaleConstant.RESTART_TO_LAUNCHER_ACTIVITY
,请使用下面的方式:
```java
// 应用切换的语言
val intent = Intent(this, TargetActivity::class.java)
LocaleHelper.getInstance()
.language(getLocale(which.toString()))
.apply(this, intent)
```
该方式会重新创建当前Activity
,默认是这种方式,可不填写。
此方式可能会因为内存低无法注销广播接收器而导致内存泄漏,解决方法请查看👉常见问题
该方式可自己实现自定义刷新界面方式,需要使用前先在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 对象覆盖掉
仅写出解决方法,本demo经测试无法复现问题
在Activity
中加入以下代码即可:
// 防止 Locale 被一个新的 Configuration 对象覆盖掉(AndroidX AppCompat 库 1.1.0-alpha03 以上版本)
override fun applyOverrideConfiguration(overrideConfiguration: Configuration?) {
overrideConfiguration?.setLocale(LocaleHelper.getInstance().getSetLocale())
super.applyOverrideConfiguration(overrideConfiguration)
}