Android BottomSheetDialog橫屏模式下布局顯示不全/狀態(tài)欄黑色

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

效果圖鎮(zhèn)樓.png

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

效果圖鎮(zhèn)樓.png

橫屏狀態(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ī)拍攝如下:

效果圖鎮(zhèn)樓.png

這個應(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);
    }
}

效果
最終橫豎屏效果如下圖:

豎屏.png

橫屏.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容