问题
Im currently working on an app which has a RecyclerView for the Settings Menu. My objective is to use strings saved in strings.xml for the RecyclerView, because my app has localization; In my case, i generate the RecyclerView with a list saved in the fragment, which needs strings from string.xml, however, trying to call strings from the xml dosnt work.
How do you pass strings from string.xml as parameters? How can i pass im this scenario?
frgSettingsMain.kt
class frgSettingsMain : Fragment() {
val listsettings = listOf(
//using @string/string here doesnt work!
dataListIcons(@string/..., "Description of option", R.drawable.ic_outline_color_lens_24),
dataListIcons(I WANT THE STRING HERE, "Description of option", R.drawable.ic_outline_dashboard_24),
dataListIcons("Option", "Description of option", R.drawable.ic_outline_image_24),
dataListIcons("Option", "Description of option", R.drawable.ic_outline_volume_up_24),
dataListIcons("Option", "Description of option", R.drawable.ic_outline_library_music_24)
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
retainInstance = true
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_settingsmain, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
rvSettingsMain.apply {
layoutManager = LinearLayoutManager(activity)
adapter = adapterSettingsMain(listsettings)
}
}
companion object {
fun newInstance(): frgSettingsMain = frgSettingsMain()
}
}
dataListIcons.kt
data class dataListIcons (
val stringTitle: String,
val stringDescription: String,
val imageIcon: Int
)
adapterSettingsMain.kt
package com.meltixdev.revomusicplayer
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.item_settingsicon.view.*
class adapterSettingsMain(
var listsettings: List<dataListIcons>
) : RecyclerView.Adapter<adapterSettingsMain.SettingsViewHolder>() {
inner class SettingsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SettingsViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_settingsicon, parent, false)
return SettingsViewHolder(view)
}
override fun getItemCount(): Int {
return listsettings.size
}
override fun onBindViewHolder(holder: SettingsViewHolder, position: Int) {
holder.itemView.apply {
rvSettingsTitle.text = listsettings[position].stringTitle
rvSettingsDescription.text = listsettings[position].stringDescription
rvSettingsIcon.setImageResource(listsettings[position].imageIcon)
}
}
}
回答1:
use getString(R.string.stringname)
Edit will make some changes to your code
data class dataListIcons (
val stringTitle: Int,
val stringDescription: Int,
val imageIcon: Int
)
val listsettings = listOf(
dataListIcons(R.string.title1, R.string.desription1,
R.drawable.ic_outline_color_lens_24),
dataListIcons(R.string.title2, R.string.desription2,
R.drawable.ic_outline_dashboard_24),
.........
)
in your adapter
holder.itemView.apply {
rvSettingsTitle.text = this.context.getString(listsettings[position].stringTitle)
rvSettingsDescription.text = this.context.getString(listsettings[position].stringDescription)
rvSettingsIcon.setImageResource(listsettings[position].imageIcon)
}
回答2:
you can always pass the string resource ids.
something like below:
fun getList(): List<Int> {
return listOf(R.string.app_name, R.string.app_name, R.string.app_name)
}
and wherever you need to get the string from ids just call
context?.getString(getList()[position])
来源:https://stackoverflow.com/questions/63104247/android-getstring-causes-error-getting-from-strings-xml