从for循环中的ResourceID获取视图

时间:2014-02-26 17:40:04

标签: java android variable-assignment

查看以下android代码。

    iv11 = (ImageView) findViewById(R.id.immg11);
    iv12 = (ImageView) findViewById(R.id.immg12);
    iv13 = (ImageView) findViewById(R.id.immg13);
    iv14 = (ImageView) findViewById(R.id.immg14);
    iv15 = (ImageView) findViewById(R.id.immg15);
    iv16 = (ImageView) findViewById(R.id.immg16);

以上6 ImageView个变量已分配6张图片。实际上我必须为36个变量做这个。是否可以使用某种for循环来完成这种赋值?

4 个答案:

答案 0 :(得分:1)

如果您的所有ImageView都在相同的布局,那么使用此代码您可以获得ID和ImageView的列表。如果它们不在同一布局中,那么您需要使用嵌套循环。

ArrayList<ImageView> imageList=new ArrayList<ImageView>();
ArrayList<Integer> idList=new ArrayList<Integer>();
LinearLayout ll;

ll=(LinearLayout)findViewById(R.id.layout);

for(int i=0;i<ll.getChildCount();i++){
        View v=ll.getChildAt(i);
        if(v instanceof ImageView){
            imageList.add((ImageView)v);
            idList.add(v.getId());
        }
 }

更新在我建议的情况下,你应该像这样使用嵌套循环

TableLayout tl;

tl=(TableLayout)findViewById(R.id.layout);

for(int i=0;i<tl.getChildCount();i++){
    View v=tl.getChildAt(i);
if(v instanceof TableRow){

    for(int j=0;j<v.getChildCount();j++){
      View innerView=v.getChildAt(j);
      if(innerView instanceof ImageView){
        imageList.add((ImageView)innerView);
        idList.add(innerView.getId());
       }
    } 
 }

}

答案 1 :(得分:0)

你可以使用类似RoboGuice之类的东西来缩短代码,但是你不必告诉Android哪个视图id要映射到哪个对象。

https://github.com/roboguice/roboguice/wiki

答案 2 :(得分:0)

您可以为图像值变量(iv ##)执行此操作但不能对R(R.id.immg ##)生成的int ID执行此操作,因为它们是自动生成的随机十六进制因此,你无论如何都必须手动分配它们,你不能迭代它们。

要将字符串转换为变量,您只需要使用(在本例中)Integer.parseInt(string),并根据您想要的数字类型,它会有所不同。

答案 3 :(得分:0)

我项目的代码:

for( Field f : R.layout.class.getFields() ){
  if( f.getName().startsWith( "image" ) ){
    try{
      IMAGE_MAP.put( f.getName().substring( 4 ).toLowerCase(), f.getInt( null ) );
    }catch( IllegalArgumentException e ){
    }catch( IllegalAccessException e ){}
  }
}