引入
產(chǎn)品提了個常規(guī)需求,從底部彈框顯示性別選擇框,以前直接用原生AlertDialog或者自定義Dialog,這次想來個不一樣的,查看開發(fā)文檔發(fā)現(xiàn)BottomSheetDialog也可以實(shí)現(xiàn),并且自帶手勢滑動和動畫,于是開搞,實(shí)現(xiàn)效果如下。

效果可以。由于產(chǎn)品需要適配橫屏,順手試了下橫屏,然后傻眼了,效果如下。

橫屏狀態(tài)下自定義的view沒有顯示全,需要手動上滑才能完全顯示。習(xí)慣性點(diǎn)了下BottomSheetDialog源碼,發(fā)現(xiàn)走onStart時BottomSheetBehavior把狀態(tài)設(shè)置成STATE_COLLAPSED了,源碼如下。
@Override
protected void onStart() {
super.onStart();
if (behavior != null && behavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
}
}
于是試著寫了個Base類繼承BottomSheetDialog,復(fù)寫onStart方法,把狀態(tài)設(shè)置成STATE_EXPANDED,運(yùn)行后正常,代碼如下:
public class BaseBottomSheetDialog extends BottomSheetDialog {
public BaseBottomSheetDialog(@NonNull Context context) {
super(context);
}
@Override
protected void onStart() {
super.onStart();
// for landscape mode
BottomSheetBehavior behavior = getBehavior();
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}
}
此時又發(fā)現(xiàn)個問題,由于我的測試機(jī)是一加7T,有美人痣前置攝像頭,導(dǎo)致StatusBar是黑色的,截圖看不出來,用另一個手機(jī)拍攝如下:

這個應(yīng)該和StatusBar高度有關(guān),于是復(fù)寫onCreate方法,代碼如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// for transparent
int screenHeight = ScreenUtil.getScreenHeight(getContext());
int statusBarHeight = ScreenUtil.getStatusBarHeight(getContext());
int dialogHeight = screenHeight - statusBarHeight;
Window window = getWindow();
if(null != window) {
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight == 0 ? ViewGroup.LayoutParams.MATCH_PARENT : dialogHeight);
}
}
測試后狀態(tài)欄顏色也正常了,以下是整個BaseBottomSheetDialog的修改代碼:
/**
* A base bottom sheet dialog that fix some bugs himself.
*
* @author majh
*/
public class BaseBottomSheetDialog extends BottomSheetDialog {
public BaseBottomSheetDialog(@NonNull Context context) {
super(context);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// for transparent
int screenHeight = ScreenUtil.getScreenHeight(getContext());
int statusBarHeight = ScreenUtil.getStatusBarHeight(getContext());
int dialogHeight = screenHeight - statusBarHeight;
Window window = getWindow();
if(null != window) {
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight == 0 ? ViewGroup.LayoutParams.MATCH_PARENT : dialogHeight);
}
}
@Override
protected void onStart() {
super.onStart();
// for landscape mode
BottomSheetBehavior behavior = getBehavior();
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}
}
效果
最終橫豎屏效果如下圖:


CSDN地址:https://blog.csdn.net/nerv2013/article/details/106453948
GitHub地址:https://github.com/afterschoolkido