在帶屏煙機(jī)項(xiàng)目中,遇到了自定義Dialog的使用場(chǎng)景
在之前的dialog的使用過(guò)程中遇到了一些問(wèn)題,比如圓角的背景,但是又不能使用背景圖片,或者使用了背景圖片也不能圓角的問(wèn)題.問(wèn)題還真多.
這次遇到的問(wèn)題是自定義布局,出來(lái)之后上面有一塊空白.高寬度定義問(wèn)題
首先看下設(shè)計(jì)圖:

明顯是要使用自定義的Dialog
好的,寫好XML,運(yùn)行預(yù)覽

出現(xiàn)了問(wèn)題
1.雖然在XML 中寫好了高寬度,但是完全是不起作用的,直接給我全屏了.
2.頂部有部分空白?不知道哪里來(lái)的.
經(jīng)過(guò)各種Google,發(fā)現(xiàn)高寬度必須要通過(guò) window 對(duì)象的layoutparam 來(lái)修改
頂部空白是因?yàn)镈ialog中默認(rèn)會(huì)有Title,開(kāi)始得到的解決方案是自定義繼承AlertDialog,但是這個(gè)代價(jià)有點(diǎn)大哦,后來(lái)才找到正確的解決方案
解決方案
Window dialogWindow = dialog.getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); lp.width = Utils.dip2px(context, realWidth); // 寬度 lp.height = Utils.dip2px(context, realHeight); // 高度 dialogWindow.setAttributes(lp);(必須要加上這句才行)
這里需要注意的是lp.width 和lp.height 就是高寬度,這里接收的是px 值,不是dp,不是dp,不是dp,重要的事情說(shuō)三遍,記住代碼里面只人px ,這里我們知道了dp值,可以通過(guò)工具類轉(zhuǎn)換出真正的px 值
Dialog dialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view);
在setContentView 之前,設(shè)置 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
或者給dialog 設(shè)置style

3.另外說(shuō)下最開(kāi)始提到的問(wèn)題的解決方案(圓角背景等等)
圓角背景首先需要讓linerlayout(或者其他布局)圓角,我們可以自定義shape ,使用xml 畫(huà)圓角,之后,(重點(diǎn))我們需要自定義style ,可參照上圖,設(shè)置透明的背景,這樣就可以實(shí)現(xiàn)圓角的背景(非常漂亮哦)
4.還有個(gè)奇葩問(wèn)題是,有些時(shí)候底部布局的margin和pading 都不會(huì)起作用(懷疑是自定義Style 引起的),這時(shí)候,可以在底部放置一個(gè)固定高度的View 即可
在項(xiàng)目中,這樣的dialog 還是很多的,所以想到可以制作工具類.以下是原創(chuàng)工具類

傳入context ,自定義的View,dp 寬度,dp 高度,dialog 是否可以取消,取消的回調(diào)就可以了,如果不需要取消的回調(diào),直接傳入null 即可,這樣就可以簡(jiǎn)易的使用自定義View 的dialog 啦
使用方法如下:
