天天看点

java dialog_RxDialog(一) -- 一个基于RxJava的Dialog

效果图

java dialog_RxDialog(一) -- 一个基于RxJava的Dialog

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() {

@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() {

@Override

public void subscribe(@NonNull final ObservableEmitter 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);

}

核心代码就这么多,具体实现请看源码。

java dialog_RxDialog(一) -- 一个基于RxJava的Dialog

欢迎关注.jpg