BSSmartDialog設(shè)計說明
概述
Android應(yīng)用開發(fā)中,如果需要彈出一個Dialog愕把,Google SDK推薦的做法是使用DialogFragment作為容器。這樣,在一些特殊操作情景下(Configuration Change拴念,如旋轉(zhuǎn)屏幕)氧映,開發(fā)者可以利用Fragment豐富的生命周期事件處理好Dialog的邏輯春畔。我們知道,在發(fā)生Configuration Change時岛都,Activity會銷毀并立即重建律姨。這樣就帶來一個問題,在Configuration Change之前設(shè)置給Dialog的listener對象臼疫,在Activity重建后是否還能夠正常接收處理Dialog上的事件择份?
方案
Activity被重建時,所關(guān)聯(lián)的DialogFragment也會跟著重建烫堤。由此得到啟發(fā):我們只要讓新重建的DialogFragment所產(chǎn)生的事件荣赶,能夠傳到新重建的Host(即打開該DialogFragment的Activity或Fragment)凤价;也就是說,把Dialog的listener設(shè)置成該Host拔创,那么listener的功能就不會受到Configuration Change的影響了利诺。該BSSmartDialog嘗試封裝了這樣的邏輯,它具備如下一些功能點:
- 支持在Activity剩燥,或者Fragment上彈框
- 支持指定一個任意布局layout慢逾,以Dialog的形式彈出
- 可以設(shè)置在Activity重建的情況下,DialogFragment是否自動恢復(fù)(再次彈出)灭红。默認(rèn)為false侣滩,不彈出
- 封裝了AlertDialog,支持排隊:在同一個Activity/Fragment上連續(xù)調(diào)用彈框時变擒,前一個dismiss后胜卤,后一個才會show
- 封裝了AlertDialog,可以修改title赁项,message葛躏,button的color、textsize屬性
使用范例
- AlertDialog樣式的使用
BSSmartDialogUtils
里提供了幾個static調(diào)用方法悠菜。其中參數(shù)最多的方法如下:
BSSmartDialogUtils.showAlertDialog(Object activityOrFragment,
CharSequence title,
CharSequence message,
CharSequence positiveButtonText,
CharSequence negativeButtonText,
CharSequence neutralButtonText,
BSStyleParam styleParam,
boolean autoRestore,
DialogInterface.OnClickListener onClickListener,
String tag)
- 彈一個普通的類似“確定/取消”的對話框:可以按需選用參數(shù)較少的簡單方法
- 如果需要在頁面重建時(Configuration Change)自動恢復(fù)彈框舰攒,設(shè)置autoRestore為true即可
- 如果期望恢復(fù)彈框后,按鈕的listener能重新連接上悔醋,則需設(shè)置onClickListener為該DialogFragment的Host(maybe
Activity or Fragment)- 如果要修改默認(rèn)title摩窃,message,button上的color芬骄,textsize樣式猾愿,可以傳入styleParam參數(shù)
- 一個任意布局的(水平居中)彈框(假設(shè)布局文件為abc)
BSSmartDialog smartDialog = BSSmartDialog.newInstance()
.setLayoutId(R.layout.share_layout)
.setDimAmount(0.3f)
.setShowBottom(false)
.setOnSmartDialogCreateListener(new BSSmartDialog.OnSmartDialogCreateListener() {
@Override
public void onSmartDialogCreate(BSViewHolder holder, BSSmartDialog dialog) {
Button button = holder.getView(R.id.action_button);
...
BSSmartDialogUtils.dismiss(MainActivity.this, Tag_ShareDialog);
}
});
smartDialog.setAutoRestore(false).setTag(Tag_ShareDialog);
smartDialog.show(getSupportFragmentManager());
最后希望對大家有所幫助,有問題歡迎討論账阻!
Github地址: https://github.com/chennyshan/BSSmartDialog
參考
NiceDialog: https://github.com/Othershe/NiceDialog