Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
如何在不使用Android上下文的情况下在ViewModel中使用Strings.xml?_Android_Kotlin_Android Viewmodel - Fatal编程技术网

如何在不使用Android上下文的情况下在ViewModel中使用Strings.xml?

如何在不使用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= "

我们有现有的应用程序,我们需要为该应用程序添加多语言支持。 使用String.xml访问的所有字符串都正在转换。 但是我们有一个常量(字符串),我们在VewModel中访问它。 这些常量没有得到翻译。代码结构如下所示

常数.kt文件

    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”字段供用户输入。