BottomSheetDialog沉浸式的一些坑

這幾天開發(fā)項目用到了BottomSheetDialog,然而這玩意并不完美,至少沉浸式是壓根沒做的,在我們的APP上使用的是自家的BaseActivity來進行沉浸式效果(不知道的請傳送門http://www.itdecent.cn/p/3905683c5df1 )而繼承BottomSheetDialog后發(fā)現(xiàn)在打開他的時候卻不是沉浸式的,狀態(tài)欄一塊大黑邊。

不走心啊不走心,你都API-24了不支持沉浸式鬧哪樣?

好吧,搜遍全Google給出的各種解決方案也都嘗試了,很多都不靠譜,要不完全用不了要么沉浸了但還留了個Android的狀態(tài)欄大灰邊,下邊給出我們解決的方案。
首先不知道BottomSheetDialog是啥的現(xiàn)在這里做下科普,知道的可以跳過本節(jié)

一、BottomSheetDialog是什么?

簡單的說就是基于屏幕底端的彈出式布局,上下拖拽就可以實現(xiàn)打開到全屏或關閉的效果,具體的來看下網(wǎng)易云音樂和微信中的你就明白它是個啥了

網(wǎng)易云音樂.png
微信.png

使用方法也很簡單,先在Gradle中添加:

dependencies{
  ...
  compile 'com.android.support:design:24.2.0'
  ...
}

再添加代碼就能用了:

BottomSheetDialog dialog = new BottomSheetDialog(me);
View box_view = LayoutInflater.from(me).inflate(R.layout.你的布局,null);
dialog.setContentView(box_view);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
dialog.show();

可以看到這玩意的本質(zhì)是一個對話框(其實還用FrameLayout可以用有興趣的去研究下)可是,無論如何這個對話框卻不是沉浸式的,該如何是好?

二、BottomSheetDialog沉浸式的探索

首先我就不提那一圈又是自定義Theme的又是給添加WindowManagerFLAG的有多蛋疼了,前者根本無效,后者沉浸式倒是沉浸式了然而你在狀態(tài)欄給我留著個灰條鬧哪樣(╯‵□′)╯︵┻━┻

好吧廢話不多說上代碼吧

首先基于上邊說的后者,能沉浸式但有灰條的,起碼成功了一半,先上改良后的代碼:

BottomSheetDialog dialog = new BottomSheetDialog(me);
View box_view = LayoutInflater.from(me).inflate(R.layout.你的布局,null);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);  //←重點在這里,來,都記下筆記
dialog.setContentView(box_view);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
dialog.show();

好了,沉浸式了,但兩個問題,一是灰條怎么去除,二是這布局拖上天后狀態(tài)欄下邊還是灰條透明的呀,不會插在狀態(tài)欄后邊口牙,這畫風不對口牙!

添加了flag的BottomSheetDialog.png

好吧回到問題,Android 5.x+的狀態(tài)欄灰條如何去除.....
嗯,如果你去百度Google找,congratulation,沒用。
至于原因,去試試就知道了

那么該怎么辦呢?

答案如下,重寫B(tài)ottomSheetDialog。以下是重寫B(tài)ottomSheetDialog的全部代碼,將布局高度設置為全屏幕高度:

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.StyleRes;
import android.support.design.widget.BottomSheetDialog;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;

/**
 * Created by ZhangChao on 2016/12/27.
 */

public class MyBottomSheetDialog extends BottomSheetDialog {

    public MyBottomSheetDialog(@NonNull Context context) {
        super(context);
    }

    public MyBottomSheetDialog(@NonNull Context context, @StyleRes int theme) {
        super(context, theme);
    }

    protected MyBottomSheetDialog(@NonNull Context context, boolean cancelable, OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int screenHeight = getScreenHeight(getContext());
        int dialogHeight = screenHeight ;
        getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight == 0 ? ViewGroup.LayoutParams.MATCH_PARENT : dialogHeight);
    }

    public static int getScreenHeight(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        int height = wm.getDefaultDisplay().getHeight();
        return height;
    }
}

配合調(diào)用代碼:

MyBottomSheetDialog dialog = new MyBottomSheetDialog(me);
View box_view = LayoutInflater.from(me).inflate(R.layout.box_progress_details,null);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
dialog.setContentView(box_view);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
dialog.show();

看下效果,嗯,結(jié)果不錯,完美解決:

剛打開.png
全屏后.png

至于為啥改了個高度就解決了灰條問題?因為在Google的Android社區(qū)里頭一群老外也在討論這事兒,有人提到修改就可以搞定了...這什么邏輯(╯‵□′)╯︵┻━┻
好吧我會繼續(xù)探索它的原因,不過起碼問題是解決了,有需要的可以用上邊的代碼直接沉浸式BottomSheetDialog,希望對大家有所幫助。
原討論貼戳這里(請自備梯子):https://code.google.com/p/android/issues/detail?id=202691

如果這篇文章對你有所幫助,也希望你可以點一下下邊的喜歡,如果有什么問題也可以在評論區(qū)與我討論。

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

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,178評論 25 708
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新...
    皇小弟閱讀 47,169評論 22 665
  • 今天又迎來了一批高級班死黨結(jié)業(yè)啦!每一期高級班的結(jié)業(yè)都帶給我們許多感動,這份感動是我們每個人作為生命個體,對...
    精尚閱讀 201評論 0 0
  • 概述 我們知道在程序運行過程中要創(chuàng)建大量的對象,和其他高級語言類似,在ObjC中對象時存儲在堆中的,系統(tǒng)并不會自動...
    孫瑋超閱讀 530評論 0 0

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