popupwindow方式實(shí)現(xiàn)
使用PopupWindow,一般來(lái)說(shuō)可以分為如下步驟:
- 創(chuàng)建并實(shí)現(xiàn)PopupWindow布局
- 實(shí)現(xiàn)PopupWindow對(duì)象實(shí)例
- 設(shè)置PopupWindow背景、動(dòng)畫(huà)屬性瘦麸、控件實(shí)現(xiàn)及事件監(jiān)聽(tīng)
-
顯示PopupWindow及位置設(shè)定只酥。
首先冈钦,一般根據(jù)自己的需求實(shí)現(xiàn)xml布局并加載篡悟,布局相對(duì)比較簡(jiǎn)單
加載布局
val layout = LayoutInflater.from(fragment.context).inflate(R.layout.dialog__plan, null)
實(shí)現(xiàn)PopupWindow對(duì)象實(shí)例
popupWindow = PopupWindow(layout, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true)
設(shè)置PopupWindow背景楼熄、動(dòng)畫(huà)屬性捞镰、控件實(shí)現(xiàn)及事件監(jiān)聽(tīng)
popupWindow.animationStyle = R.style.popp_anim
backgroundAlpha(0.5f)
layout.findViewById<TextView>(R.id.tv_cancel).setOnClickListener {
popupWindow.dismiss()
}
layout.findViewById<TextView>(R.id.tv_sure).setOnClickListener {
popupWindow.dismiss()
}
在顯示popwindow之前調(diào)用 backgroundAlpha(0.5f)將背景變暗闸与,監(jiān)聽(tīng)popupwindow狀態(tài),消失之后將背景回復(fù)
popupWindow.setOnDismissListener {
backgroundAlpha(1f)
}
backgroundAlpha()方法實(shí)現(xiàn)具體代碼
/**
* 設(shè)置添加屏幕的背景透明度
* @param bgAlpha
*/
fun backgroundAlpha(bgAlpha: Float) {
val lp = this.window.attributes
lp.alpha = bgAlpha
this.window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
this.window.attributes = lp
}
記得添加 this.window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)岸售,否則部分機(jī)型可能無(wú)效践樱,部分機(jī)型可以直接看到桌面
DidlogFragment方式實(shí)現(xiàn)
Android 官方推薦我們使用 DialogFragment 來(lái)代替 原有的Dialog ,因?yàn)镈idlogFragment可復(fù)用性更高凸丸,更加簡(jiǎn)便拷邢。創(chuàng)建 DialogFragment一般來(lái)說(shuō)有兩種:
- 覆寫(xiě)其 onCreateView 方法
- 覆寫(xiě)其onCreateDialog方法
具體過(guò)程
- 創(chuàng)建并實(shí)現(xiàn)DialogFragment布局
- 覆寫(xiě)其 onCreateView 或者onCreateDialog 方法
- 設(shè)置PopupWindow背景控件實(shí)現(xiàn)及事件監(jiān)
- 實(shí)現(xiàn)DialogFragment實(shí)例并顯示
方法一onCreateView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
//去掉默認(rèn)樣式中的title
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
val window = dialog.window
//設(shè)置dialog背景透明
window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_my_dialog, container, false)
view.findViewById<TextView>(R.id.tv_cancel).setOnClickListener {
dismiss()
}
view.findViewById<TextView>(R.id.tv_sure).setOnClickListener {
dismiss()
}
return view
}
注意設(shè)置 window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)),否則可能使布局出現(xiàn)邊等或者其他效果
方法二onCreateDialog
復(fù)寫(xiě)onCreateDialog方法屎慢,加載布局
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
// 設(shè)置主題的構(gòu)造方法
val dialog = Dialog(context!!, R.style.dl_dialog)
val inflater = activity?.layoutInflater
val view = inflater?.inflate(R.layout.fragment_dialog_dialog, null)
view?.findViewById<TextView>(R.id.tv_cancel)?.setOnClickListener {
dismiss()
}
view?.findViewById<TextView>(R.id.tv_sure)?.setOnClickListener {
dismiss()
}
dialog.setContentView(view)
return dialog
}
最后
給出MyDialogfragment瞭稼。