如何在不使用Android上下文的情况下在ViewModel中使用Strings.xml?
我们有现有的应用程序,我们需要为该应用程序添加多语言支持。 使用String.xml访问的所有字符串都正在转换。 但是我们有一个常量(字符串),我们在VewModel中访问它。 这些常量没有得到翻译。代码结构如下所示 常数.kt文件如何在不使用Android上下文的情况下在ViewModel中使用Strings.xml?,android,kotlin,android-viewmodel,Android,Kotlin,Android Viewmodel,我们有现有的应用程序,我们需要为该应用程序添加多语言支持。 使用String.xml访问的所有字符串都正在转换。 但是我们有一个常量(字符串),我们在VewModel中访问它。 这些常量没有得到翻译。代码结构如下所示 常数.kt文件 class Constants private constructor() { companion object { const val NAME= "Name" const val LAST_NAME= "
class Constants private constructor() {
companion object {
const val NAME= "Name"
const val LAST_NAME= "Last name"
}
ViewModel看起来像这样
viewmodel.getStrings()
VewModel.kt
class VewModel() : ViewModel() {
fun getStrings():String{
return NAME+LAST_NAME
}
}
在像这样的活动调用方法中
viewmodel.getStrings()
并且在所有多个strings.xml文件中都有相关的Name和Last_Name字符串
我不明白如何将这些常量字符串转换为多种语言。
我无法在viewmodel和常量中使用上下文(架构限制)。
任何帮助。在xml布局中使用绑定表达式,例如文本:
android:text="@{@string/name_label + `: ` + viewModel.name}" //not single quote, be careful
或使用AndroidViewModel:
class StudentViewModel(private val application: Application) : AndroidViewModel(application) {
val name = "Sam"
fun getNameText() = "${application.getString(R.string.name_label): $name}"
将参数传递给
ViewModel
的方式是通过ViewModelFactory
,只是样板代码:
class StudentViewModelFactory(private val application: Application) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(StudentViewModel::class.java)) {
return StudentViewModel(application) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
如果您正在使用数据绑定,您可以在布局中格式化/获取字符串。。。如果您想在viewmodel中执行此操作,则必须使用AndroidViewModel作为基础。。。然后你可以访问上下文,很明显,通过上下文你可以访问资源。。。编辑:我无法在viewmodel和常量(架构限制)中使用上下文,因此您无法访问resources@Selvin不能使用这样设计的AndroidViewModel bcz体系结构。。你能解释一下布局中的格式/获取字符串吗?这在官方指南(参考资料部分)的“布局和绑定表达式”中有解释。@Selvin我会查的。。Thanksandroid:text=“@{@string/name_label+
:
+viewModel.name}”这将如何帮助。。它将连接两个字段。。。将名称合并为两种语言(例如日本名称和英文名称)@Gaju Kollur我假设您已经知道如何在String.xml
文件中进行翻译,那么下一个问题是,什么可以翻译,什么不能翻译。对于标签“Name:”、“Age:”等常规文本,它们可以被翻译,您应该将它们放在String.xml
中。但对其他人来说,如客户名称或产品名称,这些通常很难标准化翻译,更不用说方言了。因此,对于需要手动翻译的文本,一个好方法是提供“seconday name”字段供用户输入。