RxDialog(一) -- 一个基于RxJava的Dialog
2017-10-28 本文已影响412人
雷l阵l雨
效果图
Rxdialog.gif看图是和普通的Dialog一样。
RxDialog的作用就是把一个普通的Dialog的按钮点击事件转化成Rxjava的形式。
我们先来看下普通的创建Dialog的形式:
new AlertDialog.Builder(MainActivity.this)
.setTitle("title")
.setMessage("Message")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
再来看下RxDialog的创建形式:
new MyRxDialog(MainActivity.this)
.setTitle("title")
.setMessage("Message")
.setPositiveText("确定")
.setNegativeText("取消")
.setNeutralText("中立")
.dialogToObservable()
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
switch (integer){
case MyRxDialog.POSITIVE:
Toast.makeText(MainActivity.this, "Positive", Toast.LENGTH_SHORT).show();
break;
case MyRxDialog.NEGATIVE:
Toast.makeText(MainActivity.this, "Negative", Toast.LENGTH_SHORT).show();
break;
case MyRxDialog.NEUTRAL:
Toast.makeText(MainActivity.this, "Neutral", Toast.LENGTH_SHORT).show();
break;
default:
Log.e("MyRxDialog", integer+"");
break;
}
}
});
具体实现
我们可以看到RxDialog和普通的Dialog的差别就在于dialogToObservable(),其实就是把click事件转化为了Observable,这样就可以支持Rxjava了。
接下来看下dialogToObservable()的实现方式:
public Observable dialogToObservable(){
return Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull final ObservableEmitter<Integer> e) throws Exception {
DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
switch (i){
case -1:
e.onNext(POSITIVE);
break;
case -2:
e.onNext(NEGATIVE);
break;
case -3:
e.onNext(NEUTRAL);
break;
default:
e.onNext(i);
}
}
};
builder.setPositiveButton(positiveText, onClickListener);
builder.setNegativeButton(negativeText, onClickListener);
builder.setNeutralButton(neutralText, onClickListener);
builder.show();
}
});
}
这里其实就是创建了一个Observable,是不是很简单,不过很多人可能会使用Flowable,这里也提供了。
public Flowable dialogToFlowable(){
return Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(@NonNull final FlowableEmitter e) throws Exception {
DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
switch (i){
case -1:
e.onNext(POSITIVE);
break;
case -2:
e.onNext(NEGATIVE);
break;
case -3:
e.onNext(NEUTRAL);
break;
default:
e.onNext(i);
}
}
};
builder.setPositiveButton(positiveText, onClickListener);
builder.setNegativeButton(negativeText, onClickListener);
builder.setNeutralButton(neutralText, onClickListener);
builder.show();
}
}, BackpressureStrategy.BUFFER);
}
核心代码就这么多,具体实现请看源码。
欢迎关注.jpg