Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修剪代码?_Java_Android - Fatal编程技术网

Java 如何修剪代码?

Java 如何修剪代码?,java,android,Java,Android,在我的代码中,我有很多这样的代码块。。。例如: if(Avatar==1) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar1); if(Avatar==2) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar2); if(Avatar==3)

在我的代码中,我有很多这样的代码块。。。例如:

if(Avatar==1) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar1);
if(Avatar==2) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar2);
if(Avatar==3) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar3);
if(Avatar==4) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar4);
if(Avatar==5) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar5);
if(Avatar==6) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar6);
if(Avatar==7) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar7);
if(Avatar==8) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar8);
if(Avatar==9) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar9);
if(Avatar==10) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar10);
if(Avatar==11) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar11);
if(Avatar==12) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar12);
if(Avatar==13) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar13);
if(Avatar==14) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar14);
if(Avatar==15) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar15);
if(Avatar==16) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar16);
if(Avatar==17) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar17);
if(Avatar==18) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar18);
if(Avatar==19) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar19);
if(Avatar==20) ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.avatar20);
例如,我可以用PHP编写:

**$STRINGavatar** = "avatar20";
echo"((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(R.drawable.**$STRINGavatar**)";

但是在Java中,它不起作用:-(

您应该尝试在不同的行中执行它

ImageView iv = (ImageView) dialogPopup.findViewById(R.id.imgView);
iv.setImageResource(R.drawable.avatar20)
您可以将其用于可拉伸的


int id=getResources().getIdentifier(imageName,“drawable”,getPackageName());
您可以执行以下操作

getContext().getResources().getIdentifier("avatar" + i, "drawable", getContext().getPackageName())
根据名称获取资源

[编辑]

然后你的代码是:

int resId = getContext().getResources().getIdentifier("avatar" + Avatar, "drawable", getContext().getPackageName());
((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(resId);

你的可变化身应该以小写字母开始。首先,对你明显复制和粘贴的部分使用一个函数

if (Avatar==1) setImage(R.drawable.avatar1);
if (Avatar==2) setImage(R.drawable.avatar2);
if (Avatar==3) setImage(R.drawable.avatar3);
//...    

private void setImage(final int resource)
{
    ((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(resource);
}
这至少在水平方向上缩小了它,并消除了大量的重复

下一步是将整数和资源之间的映射移动到一个位置,特别是当您需要多次查询时:

private int getResource(final int avatar)
{
    switch(avatar)
    {
        case 1: return R.drawable.avatar1;
        case 2: return R.drawable.avatar2;
        case 3: return R.drawable.avatar3;
        //...
        default:
            throw new RuntimeException("No avatar for this");
    }
}
然后您可以将上述代码更改为:

setImage(getResource(avatar));

动态获取资源id:-

int id = getResources().getIdentifier("avatar" + Avatar, "drawable", getPackageName());
((ImageView)(dialogPopup.findViewById(R.id.imgView))).setImageResource(id);

尝试此方法,使用枚举结构,如下所示

public enum Avatar {
   R.drawable.avatar1, R.drawable.avatar2, ..R.drawable.avatar20;
   public static final Avatar values[] = values();
}
 public static void main(String []args){
   Drawable avatar = Avatar.values[1];//just put in the number to get the drawable
 }
}

enums…enums everywhere.@Jason enums将如何缩减代码?这肯定比我的回答要好。这不是不安全和不可重构吗?@Joey Pinto如果文件名不正确,它在运行时也会失败,而类似我的回答在编译时会失败。@Joey Pinto如果不安全,你的意思是说如果资源为n,会发生什么找不到,GetIdentifier返回0,图像不显示。因此应用程序不会崩溃,但UI中会丢失一个图像。可重构是什么意思?如果必须更改文件名怎么办?你是硬编码,不是好代码的特征。反射也会带来安全问题。这甚至不会生成。这不是一个枚举。如果你真的把所有的可绘制元素都放在一个枚举中,我想你可以得到一个OOM