我想动态更改我的应用程序语言,而无需重新启动Activity
以使结果生效。我现在正在做的是添加一个可变Boolean
状态,它是 switch 并被所有Text
元素使用。
要更改语言,我在可点击回调中调用以下代码(我将框用作虚拟对象,只是为了测试):
val configuration = LocalConfiguration.current
val resources = LocalContext.current.resources
Box(
modifier = Modifier
.fillMaxWidth()
.height(0.2.dw)
.background(Color.Red)
.clickable {
// to change the language
val locale = Locale("bg")
configuration.setLocale(locale)
resources.updateConfiguration(configuration, resources.displayMetrics)
viewModel.updateLanguage()
}
) {
}
然后它使用updateLanguage()
方法切换语言值
@HiltViewModel
class CityWeatherViewModel @Inject constructor(
private val getCityWeather: GetCityWeather
) : ViewModel() {
private val _languageSwitch = mutableStateOf(true)
var languageSwitch: State<Boolean> = _languageSwitch
fun updateLanguage() {
_languageSwitch.value = !_languageSwitch.value
}
}
问题是,为了更新每个Text
可组合,我需要将 传递viewmodel
给所有使用的后代,Text
然后每次使用一些错误的逻辑来强制更新,视图模型中会发生一些变化。
@Composable
fun SomeChildDeepInTheHierarchy(viewModel: CityWeatherViewModel, @StringRes textResId: Int) {
Text(
text = stringResource(id = if (viewModel.languageSwitch.value) textResId else textResId),
color = Color.White,
fontSize = 2.sp,
fontWeight = FontWeight.Light,
fontFamily = RobotoFont
)
}
它有效,但这是一些非常糟糕的逻辑,而且代码非常难看!是否有Locale
动态更改使用 Jetpack Compose 的标准方法?