之前在知乎上看到个帖子,“你见过哪些令你瞠目结舌的 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/"'
       }

第一次发现时尝试,确实省时省力!想懒一点的就偷偷用上。

待补充……

results matching ""

    No results matching ""