如何在android [kotlin]中获取图片的resourceId?

时间:2018-06-21 09:37:57

标签: android listview kotlin

我正在尝试使用自定义适配器(没有视图固定器)创建列表视图。我想将图像插入到我的自定义列表视图中。

我最终得到了这一行代码:

class CategoryAdapter(context: Context, categories: List<Category>) : BaseAdapter(){

val context = context
val categories = categories

override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
    val categoryView: View

    categoryView = LayoutInflater.from(context).inflate(R.layout.category_list_item, null)
    val categoryImage : ImageView = categoryView.findViewById(R.id.imageView2)
    val categoryName : TextView = categoryView.findViewById(R.id.textView2)

    val category = categories[position]


    val resourceId = context.resources.getIdentifier(category.image, "drawable", context.packageName)
    categoryImage.setImageResource(resourceId)
    categoryName.text = category.title

    return categoryView
}

override fun getItem(position: Int): Any {
    return categories[position]

}

override fun getItemId(position: Int): Long {
    return 0
}

override fun getCount(): Int {
    return categories.count()
}}

这完全正常。我对下一行的工作方式一无所知。

  val resourceId = context.resources.getIdentifier(category.image, "drawable", context.packageName)

你能解释一下我的代码吗?

1 个答案:

答案 0 :(得分:0)

您要使用:

在Android中动态检索资源

通常,在代码中检索资源(图纸,字符串,您拥有的东西)时,您会使用自动生成的R.java来实现。但是,我最近在我的应用程序中,其中ImageView中的项旁边有一个不同的图标。所有这些数据都以Image的形式存储在drawable中,这意味着我无法将数据链接到R.java。 尽管如此,我仍然需要某种方法来保留Drawable的名称,因此我首先转向getResources().getIdentifier()。此方法可以很好地在任何包中找到所需内容的资源ID:

基于此Blog

类似:

if (cnt == 7) {
    cnt = 1;
}
int resID = getResources().getIdentifier("ad_banner" + cnt, "drawable", getPackageName());
activityTwillioCallBinding.imgAdView.setImageResource(resID);
cnt++;

这一切都很好。

基于本文档https://developer.android.com/reference/android/content/res/Resources.html#getIdentifier(java.lang.String,%20java.lang.String,%20java.lang.String)

getResources()

为应用程序的包返回一个Resources实例。

公共int getIdentifier(字符串名称,字符串defType,字符串defPackage)

返回给定资源名称的资源标识符。完全限定的资源名称的格式为“ package:type / entry”。如果分别在此处指定了defType和defPackage,则前两个组件(package和type)是可选的。

注意:不鼓励使用此功能。按标识符检索资源比按名称检索资源要有效得多。

参数

name字符串:所需资源的名称。

defType字符串:如果名称中不包含“ type /”,则为查找的可选默认资源类型。可以为null,以要求使用显式类型。

defPackage字符串:如果名称中未包含“ package:”,则为查找的可选默认软件包。可以为null,以要求使用显式包。

返回 int int关联的资源标识符。如果找不到这样的资源,则返回0。 (0不是有效的资源ID。)