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