当前位置: 代码迷 >> Android >> Android ImageView.setImageResource(int resId)的参数有关问题
  详细解决方案

Android ImageView.setImageResource(int resId)的参数有关问题

热度:267   发布时间:2016-04-27 22:36:30.0
Android ImageView.setImageResource(int resId)的参数问题
最近学习Android,在Activity上添加了一个GridView,
在工程的res/drawable里添加了63幅.jpg图片,
在重写的ArrayAdapter的getView()方法中,
使用imageView.setImageResource( R.drawable.pic1 ),可以正常设置每个ImageView为图片1
因为R.drawable.pic1为第一个索引,而且我也打开R.java看了,
所有的picture的索引都是连续的,
所以我就想用imageView.setImageResource(R.drawable.pic1+position)来设置每个ImageView为不同的图片,
这样打开的软件不能显示图片,而且片刻就退出了。
也试了用setImageBitmap和setImageDrawable,
每次需要用到picture的索引时,只能用R.drawable.picX,
而不能是R.drawable.pic1+position-----position是
public View getView(int position, View convertView,ViewGroup parent)里的参数。
怀疑好像图片索引只能是 final int类型的
如果这样写:setImageResource(R.drawable+1),是可以运行的
也就是说,setImageResource()中的参数必须是final的,对吧
代码截图如下:


我自己定义了一个 GalleryItem:
public class GalleryItem{
    ?final int mIndex;
    ?public Gallery(int index){
    ?    ?mIndex=index;
    ?}
    ?
    ?public int getIndex(){
    ?    ?return mIndex;
    ?}
}
然后以这个GalleryItem为泛型类型定义了一个
ArrayList<GalleryItem> mItems=new ArrayLlist<GalleryItem>( );
并且对其进行构造:
for(int i=0;i<63;i++){
    ?GalleryItem item=new GalleryItem(R.drawable.pic1+i);
    ?mItems.add(item);
}
然后以将这个 mItems传给了ArrayAdapter。也就是说,在getView()里,position会有0~62个不同的值。
我也用 GalleryItem item=getItem(position)来获取每个Item,并调用
imageView.setImageResource(item.getIndex())来设置图片,还是不管用啊,用setImageBitmap和setImageDrawable也是不行啊。
主要矛盾就在于我需要图片的索引,但我不能为每个ImageView但读写一句setImageResource(R.drawable.picX)吧,所以想用setImageResource(R.drawable.pic1+position)或setImageResource(item.getIndex()),可是不管用啊,只有直接用setImageResource(R.drawable.picX)才行。可我又不可能把63个都写上吧,那还算什么编程啊。求指教
------解决思路----------------------
R.drawable.pic1+1并不等于R.drawable.pic2,所以你可以换一种方式,直接通过文件名获取资源文件

            Field field;
            int imgRid = 0;
            try {
                field = (Field) R.drawable.class.getDeclaredField(“文件名”);
                imgRid = field.getInt(R.drawable.class);
            } catch (Exception ex) {
                Log.e("Exception", "" + ex.getMessage());
            }

初始化为这样的字符串:pic1,pic2,pic3……
------解决思路----------------------
问题:
图片在R文件中进行映射,有唯一的ID值这个没错,但是有三点需要注意,第一,图片是pic1、pic2...不代表这个唯一值也是连续的,第二,能通过R.drawable.xxxx映射出int值,不代表可以通过int值反映射回drawable,第三,图片的ID值在R中是变的,这个我以前验证过。所以无法用你上面的方法来使用。
解决办法:
1:通过文件名获取文件
 图片放在sdcard中:
Bitmap imageBitmap = BitmapFactory.decodeFile(path)  (path 是图片的路径,跟目录是/sdcard)

图片在项目的res文件夹下面:
ApplicationInfo appInfo = getApplicationInfo();
int resID = getResources().getIdentifier(name, "drawable", appInfo.packageName);

这里,你的name就可以通过组合的方式(“pic”+position)获取,这样就可以把该操作放在getView中进行。
2:把你的图片写入一个数组中,在数组中依次调用,这是最简单的方法。
private int[] drawables = {R.drawable.pic1,R.drawable.pic2,...};


------解决思路----------------------
我想到两个方案:
1、就是上面所说的,用int[]数组保存你的图片id;
2、用这个方法:
假设创建工程的时候,填写的package名字为:com.test.image 
int resID = getResources().getIdentifier("imageName", "drawable", "com.test.image"); 

可以根据你的图片名来获取你的资源id,可以看这篇文章http://www.cnblogs.com/mybkn/archive/2012/05/30/2526375.html
  相关解决方案