rosu 的博客

Android 札记系列 (5):ButterKnife, RxJava 和 XML

2018-08-05

ButterKnife

在 Fragment 中使用 ButterKnife

Fragment 中使用 ButterKnife,只需要在onCreateView() 方法中绑定视图就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private Unbinder mUnbind;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_no_man, container, false);
...
mUnbind = ButterKnife.bind(this, view);
return view;
}

@Override
public void onDestroyView() {
super.onDestroyView();
mUnbinder.unbind();
}

ButterKnife 点击监听

使用 ButterKnife 也可以直接为按钮等控件设置监听。

1
2
3
4
@OnClick(R.id.test_btn)
void test(){
// do something
}

这样就不用写很多的代码啦。
参看

RxJava

在本周的使用过程中,逐步又学会了一些 RxJava 的有趣的用法。

RxJava 中的 FlatMap 的神奇用法

如果你还不了解 RxJava 或者 FlatMap 的一些概念或用法,推荐看下面的文章:

flatMap()这个有趣的函数…我是刚领略他的美妙啊…当然,我只是了解了很基础的使用。

如果你了解了 Map() 你就知道,Map()函数,你应该知道我们可以在 Map() 函数里面实现对数据的转换。
flatMap()也是用来实现转换功能的,不过它是直接转换一整个 Observable 对象,相当于生成了一个全新的 Observable 对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Observable
.just(2)
.subscribeOn(AndroidSchedulers.mainThread())
.flatMap(new Function<Integer, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(Integer integer) throws Exception {
// do someing here
// 转换当前 Observable 为新的 Observable
return Observable
.interval(integer, TimeUnit.SECONDS)
.take(1);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe();

像上面这样操作的话,就可以将原本的任务转换为另一个新的任务。在过去的那一周里,大量用到了这个方法,来实现定时器。

RxJava 的时间操作符

我也是用到了才知道,RxJava中有 timer(), interval()delay()等『时间操作符』。

你可以看 这篇文章 来了解他们的区别。其实该作者总结得非常不错了。

大部分文章都会使用官方的 marble diagrams 来描述操作符,所以建议你好好理解一下图里的标记含义。

下面是我自己的理解笔记,可以适当忽略。

  • 操作符的操作对象是谁

这只是我个人的理解,并不一定非常正确。

  • delay()这个操作符是 『接受了Observable 对象的事件流』之后,平滑推移 『指定时间』 后再将事件发射出去
    • delay()没有直接操作 Observable 对象,而是对事件流进行操作
  • timer()是直接返回一个 『在指定时间后发射一个 0 值的Observable 对象』
    • timer()生成了一个新的Observable,这个对象会自己延迟一段时间发射事件

现在是不是清楚了很多了呢~

参看

XML 文件的一些问题

前几天遇到一个编译项目的时候遇到一个错误:

ic_launcher.xml:3: AAPT: error: resource drawable/ic_launcher_background (aka android.example.com/ic_launcher_background) not found.

我百思不得其解啊…为什么默认的图标文件会报错呢…即便将这个 XML 文件删除了,依旧会报其他 XML 文件的错误…

后面我自己每个资源文件都看了,发现…我某个文件里是这样子的:

1
2
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>

多写了一行 XML 声明…

@BindView-annotated class incorrectly in Android framework package

后来 Google 后,才发现,如果你使用了 ButterKnife,那么你的包名中不能是这样的:android.*java.*

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章