Жестко закодированная строка Kotlin

#java #android #kotlin #multilingual

#java #Android #kotlin #многоязычный

Вопрос:

Я хочу добавить многоязычную поддержку в свое приложение, используя редактор переводов Android Studio. Но он поддерживает только строки .xml. У меня есть несколько строк в классе данных, и я использую класс данных для создания ArrayList. Я действительно хочу вызвать эти строки из .xml, но я не мог понять, как это сделать.

мой класс данных:

 data class Infodc (
        val id: Int,
        val header: String,
        val image: Int,
        val infoOne: String,
        val infoTwo: String
)
  

мой список

 object Constants{
    fun getInfo(): ArrayList<Infodc>{
        val infoList = ArrayList<Infodc>()

        val inf1 = Infodc(
            1, "header_str", R.drawable.image0,
            "string_1", "string_2")
        infoList.add(inf1)
        return infoList
    }
}
  

Я пытался R.string.string_header header = "header_str" , но это показывает только 10 цифр, а не саму строку.

После этого я попытался getString , но снова потерпел неудачу.

Ответ №1:

Вы можете сделать это следующим образом:

 class MainActivity : AppCompatActivity()
{
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val infodc = Infodc(
            1,
            R.string.header,
            R.drawable.ic_launcher_foreground,
            R.string.info_one,
            R.string.info_two,
            this
        )

        Log.d("MyTag", "$infodc") // D/MyTag: Infodc(id=1, header=Header, image=2131099744, infoOne=Info One, infoTwo=Info Two)


    }
}

data class Infodc(
    val id: Int,
    val header: String,
    val image: Int,
    val infoOne: String,
    val infoTwo: String
)
{
    constructor(
        id: Int,
        @StringRes header: Int,
        @DrawableRes image: Int,
        @StringRes infoOne: Int,
        @StringRes infoTwo: Int,
        context: Context
    ) : this(
        id,
        context.getString(header),
        image,
        context.getString(infoOne),
        context.getString(infoTwo)
    )
}
  

Теперь вы можете передать конструктору идентификатор строки и изображения, но в качестве поля класса вы получите String


Другой способ — создать класс, который содержит только идентификатор строки, а затем, когда вы захотите его использовать, используйте getString это поле.

Комментарии:

1. Спасибо за вашу помощь, это работает. Я хочу спросить ) : this( , это идентификатор или он исходит от context: Context ?

2. Я не понимаю:/ : this вызывает конструктор, и вы передаете context , чтобы иметь возможность получать строку из приложения