接上篇,上邊已經實現了將
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
,程式碼也很好理解.