這幾天開發(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)易云音樂和微信中的你就明白它是個啥了


使用方法也很簡單,先在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)欄后邊口牙,這畫風不對口牙!

好吧回到問題,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é)果不錯,完美解決:


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