之前在知乎上看到个帖子,“你见过哪些令你瞠目结舌的 Android 代码技巧?” 在此,整理、补充……
比较字符串
刚开始是这样写的:
if(response.getResult().equals("xxx")){}
但这样也是最容易出错的,何不把它反过来:
if("xxx".equals(response.getResult())){}
这样又兼容到坑爹的服务端数据,又省了try{}catch()处理,这是不是很实用的小技巧?
集合去重
之前看到过这么个说法,普通程序员这样写:
for(int i=0;i<list.size();i++){}
工程师这样写:
list.removeAll();
list.addAll();
虽然实现逻辑一样,但这云泥之别不就立即体现出来了么?
android BuildConfig 妙用
在 ADT r17 后推出了 BuildConfig 功能,它和 R.java一样,由 build tools 自动生成。
它可以做些什么呢?
在 android studio 中,项目目录下的 build/generated/source 下,可以发现有好几 个buildConfig目录
findViewById 技巧
public <T extends View> T $(int id) {
return (T) super.findViewById(id);
}
public <T extends View> T $(View view, int id) {
return (T) view.findViewById(id);
}
省去了强制转换的代码,非常实用,你第一次看到时,觉得会有瞠目结舌之感,泛型能这么用。熟悉泛型绝对是菜鸟到进阶的必经之路。
实现类放空接口减少代码量
定义的接口方法有好几个,但实现时可能只处理其中的一个回调。比如android中的默认动画监听:
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {}
@Override
public void onAnimationRepeat(Animation animation) {}
});
嫌篇幅过长,定义个实现类AnimListener实现AnimationListener,调用时只要实现需要处理的回调方法即可:
animation.setAnimationListener(new AnimListener() {
@Override
public void onAnimationEnd(Animation animation) {
super.onAnimationEnd(animation);
}
});
控件动画过多的情况下,用上这个小技巧,是不立马清新脱俗了很多?(我不会告诉你们这是在开源项目---com.nineoldandroids(动画兼容)中学到的)
字符串格式化
虽然大家可能都会用,但第一次看到,确实是有瞠目结舌之感。
String str = String.format("来自%s~","thearyong");
%s、%d等看着眼熟吧?初学编程时,c语言的打印,有木有印象~~ 在strings.xml中这样声明,多个地方引用时,多么的明智。谁用谁知道!!!
神奇的与或运算
在针对多个条件多个操作时,为了避免长篇累牍的switch/if-else,与或运算粉墨登场(ps:c代码写多的码友可以直接跳过)。如:
/**
* 控制3个按钮的显示隐藏,避免长篇大幅.如果有2个以上显示,对应的值相或,如:1|2|4
* tv1:0x1
* tv2:0x2
* tv3:0x4
*/
void magicAndOrOperation(int mask) {
tv_1.setVisibility((mask & 0x1) == 0x1 ? View.VISIBLE : View.GONE);
tv_2.setVisibility((mask & 0x2) == 0x2 ? View.VISIBLE : View.GONE);
tv_3.setVisibility((mask & 0x4) == 0x4 ? View.VISIBLE : View.GONE);
}
实际调用:
case OrderState.STATE_RETURN:
magicAndOrOperation(2|4);
//下面是对应之前的写法,上面还有N多状态,对应不同的按钮显示、隐藏
//tv_1.setVisibility(View.GONE);
//tv_2.setVisibility(View.VISIBLE);
//tv_3.setVisibility(View.VISIBLE);
break;
上面孰优孰劣,一看便知。
BuildConfig字段
在 ADT(r17)后,构建器增加了 BuildConfig,android studio 中的 gradle也自带此功能。其中BuildConfig.DEBUG,区别 debug 和 release 版本字段,可用来开关打印。虽然不至于特别出奇,但也算很实用。还支持自定义字段,比如区分线上线下环境的 api_url 等,使用很简单:
buildConfigField 'String','HOST_URL','"http://thearyong.com/api/"' 第一个参数类型,第二个参数字段名,第三个参数字段值。 android studio 中 gradle build 是会在项目的 build/generated/source/自动生生成一个 BuildConfig.java 文件,里面其实就是定义的一些静态字段:
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
// Fields from default config.
public static final String HOST_URL = "http://thearyong.com/api/";
}
buildTypes {
release {
buildConfigField 'String','HOST_URL','"http://thearyong.com/api/"'
}
debug {
buildConfigField 'String','HOST_URL','"http://192.168.1.110/api/"'
}
第一次发现时尝试,确实省时省力!想懒一点的就偷偷用上。