接上篇,上边已经实现了将
View
的点击事件以RxJava
形式实现,这篇实现将TextView
以及子类
的的文字变化以RxJava
实现,有了上篇的基础这篇就很更简单了. 首先是建立静态方法,传入View,注意这里需要监听的是文字变化,所以传入的应该是TextView
以及子类.
public class RxView {
/**
*
* @param textView 需要监听文字变化的view
* @return 返回一个可被订阅的observable
*/
public static Observable<CharSequence> textChanges(TextView textView){
return null;
}
}
复制代码
然后就是编写我们的observable
,点击事件是在onClickListener
上面做文章,文字变化你估计已经猜到了,是在TextWacher
上面做文章.
public class ViewTextChangesObservable extends Observable<CharSequence> {
private TextView mTextView;
public ViewTextChangesObservable(TextView mTextView) {
this.mTextView = mTextView;
}
@Override
protected void subscribeActual(final Observer<? super CharSequence> observer) {
//被订阅时,为TextView增加TextWatcher,文字文化时,向下游发射事件
mTextView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
observer.onNext(s);
}
@Override
public void afterTextChanged(Editable s) {
}
});
//发送现有的事件到下游,便于combineLatest等操作符的使用
observer.onNext(mTextView.getText());
}
}
复制代码
也很简单,和点击事件不同的是多发送了一个目前的文字事件到下游,这样做是为了方便某些操作符比如(combineLates
)的使用,这些操作符依赖observable
上一次发射的事件.
修改RxView的代码:
public class RxView {
/**
*
* @param textView 需要监听文字变化的view
* @return 返回一个可被订阅的observable
*/
public static Observable<CharSequence> textChanges(TextView textView){
return new ViewTextChangesObservable(textView);
}
复制代码
测试代码:
public class MainActivity extends AppCompatActivity {
String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RxView.clicks(findViewById(R.id.tv_obs))
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Log.d(TAG, "我被点击了");
}
});
TextView textView = findViewById(R.id.tv_obs);
RxView.textChanges(textView)
.subscribe(new Consumer<CharSequence>() {
@Override
public void accept(CharSequence charSequence) throws Exception {
Log.d(TAG, "我的当前文字为: " + charSequence);
}
});
textView.setText("test");
}
}
复制代码
输出:
05-04 01:58:37.355 3062-3062/april.lesincs.rxbinding_demo D/MainActivity: 我的当前文字为: Hello World!
05-04 01:58:37.355 3062-3062/april.lesincs.rxbinding_demo D/MainActivity: 我的当前文字为: test
复制代码
测试成功!监听文字变化也实现了,代码很短,而且只要理解了RxJava
,代码也很好理解.