###### tags: `Android` `Kotlin` # Dialog ## 自定義Dialog ```kotlin= private var dialog: Dialog? = null fun showCustom(activity: Activity, layout: Int, keyboard: Boolean = false, gravityPosition: Int = -1): View? { if(!activity.isDestroyed){ dialog?.dismiss() dialog = AlertDialog.Builder(activity).create() dialog?.requestWindowFeature(Window.FEATURE_NO_TITLE) //無標題 dialog?.window?.setBackgroundDrawableResource(android.R.color.transparent) //透明背景 //設定 Dialog 位置 (ex: gravityPosition = Gravity.Bottom) if (gravityPosition != -1) { val wlp = dialog?.window?.attributes wlp?.gravity = gravityPosition wlp?.flags = wlp?.flags?.and(WindowManager.LayoutParams.FLAG_DIM_BEHIND.inv()) dialog?.window?.attributes = wlp } dialog?.show() //若畫面有 EditText,則設定 keyboard = true,用來解決 dialog 焦點問題 if(keyboard) dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM) val view = View.inflate(activity, layout, null) //取得客製化畫面 dialog?.setContentView(view) return view } return null } ``` ==使用方式== ```kotlin= private fun showEditDialog(uid: String, msg: String) { val mActivity = context as YouTubeActivity DialogManager.instance.showCustom(mActivity, R.layout.dialog_input, true, Gravity.BOTTOM)?.let { val tv_title = it.findViewById<TextView>(R.id.tv_title) val ed_message = it.findViewById<EditText>(R.id.ed_message) val tv_send = it.findViewById<TextView>(R.id.tv_send) val img_cancel = it.findViewById<ImageView>(R.id.img_cancel) tv_title.text = "編輯留言" ed_message.setText(msg) tv_send.setOnClickListener { val content = ed_message.text.toString() if (content.isEmpty() || content.isBlank()) return@setOnClickListener val req = VideoEditMessageReq(videoID, uid, content) DataManager.instance.doVideoEditMessage(req) DialogManager.instance.cancelDialog() } img_cancel.setOnClickListener { DialogManager.instance.cancelDialog() } it.post { Method.showKeyBoard(mActivity, ed_message) } } } ``` ## 寬度滿屏Dialog 由於 Dialog 在 Build 的時候,會有系統預設的主題,這個主題會讓我們無法把 Dialog 的寬度填滿螢幕 所以要先制定一個主題,並在建立 Dialog 時給予自訂的主題 在 styles.xml 新增 ```xml= <style name="Theme_Dialog" parent="android:Theme.Holo.Dialog"> <item name="android:windowMinWidthMajor">100%</item> <item name="android:windowMinWidthMinor">100%</item> </style> ``` 建立 Dialog 時使用 ```kotlin= AlertDialog.Builder(activity, R.style.Theme_Dialog).create() ``` ## 參考文章 [Dialog 位置設定](https://blog.csdn.net/Naide_S/article/details/80091191) [寬度滿屏 Dialog](https://stackoverflow.com/questions/40756208/android-dialog-occupy-100-width/40756329)