Android 用DialogFragment自定义Dialog

1.代码

 1 class NotifyAlertDlg (var callback : ((dlg : NotifyAlertDlg) -> Unit)? = null): DialogFragment() {
 2 
 3     lateinit var binding : NotifyAlertBinding
 4 
 5     fun initBinding(){
 6         binding.notifyDlgClose.setOnClickListener(this::onCloseClicked)
 7         binding.notifyAlertOk.setOnClickListener(this::onOpenClicked)
 8     }
 9     fun onCloseClicked(v : View){
10         dialog?.dismiss()
11     }
12     fun onOpenClicked(v : View){
13         callback?.invoke(this)
14     }
15 
16     override fun show(transaction: FragmentTransaction, tag: String?): Int {
17         return super.show(transaction, tag)
18     }
19 
20     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
21         binding = NotifyAlertBinding.inflate(inflater,container,false)
22         initBinding()
23         return binding.root
24     }
25 
26     override fun onActivityCreated(savedInstanceState: Bundle?) {
27         super.onActivityCreated(savedInstanceState)
28     }
29 
30     override fun onStart() {
31         context?.let {
32             initDialog(it)
33         }
34         super.onStart()
35     }
36     fun initDialog(context: Context){
37         dialog?.apply {
38             setCancelable(true)             //取消
39             setCanceledOnTouchOutside(true) //点击外部不消失的方法
40 
41         }
42         val window = dialog?.window?.apply {
43             setBackgroundDrawableResource(R.color.transparent)      //如果不设置背景,有白色的直角边。
44             decorView.setPadding(32,0,32,0) //设置背景后,在layout中的margin失效,在这里设置
45         }
46         if(window == null){
47             return
48         }
49         val params = window.attributes.apply {
50             width = (window.windowManager.defaultDisplay.width * 0.91f).toInt()//按比例显示
51             height = WRAP_CONTENT
52             gravity = Gravity.CENTER
53             dimAmount = 0.3f            //设置Dialog弹出时背景的透明度
54             horizontalMargin = 0f       //设置Dialog水平方向的间距
55             verticalMargin = 0f         //设置Dialog垂直方向的间距
56 //            verticalWeight = 0.5f
57 //            horizontalWeight = 0.5f
58             x = 0                       //设置Dialog显示时X轴的坐标,具体屏幕X轴的偏移量
59             y = 0                       //设置Dialog显示时Y轴的坐标,距离屏幕Y轴的偏移量
60             alpha = 1f                  //设置Dialog的透明度
61             windowAnimations = 0        //设置Dialog显示和消失时的动画
62 
63         }
64         window.attributes = params as WindowManager.LayoutParams?
65     }
66 }

2.dialog的布局

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <androidx.constraintlayout.widget.ConstraintLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:app="http://schemas.android.com/apk/res-auto"
 5     android:layout_gravity="center"
 6     android:background="@drawable/notify_bg"
 7     android:layout_width="match_parent"
 8     android:layout_height="match_parent">
 9 
10     <ImageView
11         android:id="@+id/notify_dlg_close"
12         android:layout_width="48dp"
13         android:layout_height="48dp"
14         android:padding="16dp"
15         app:layout_constraintBottom_toTopOf="@+id/notify_dlg_content"
16         app:layout_constraintEnd_toEndOf="parent"
17         app:layout_constraintTop_toTopOf="parent"
18         app:layout_constraintVertical_chainStyle="packed"
19         app:srcCompat="@mipmap/close" />
20 
21     <TextView
22         android:id="@+id/notify_dlg_title"
23         android:layout_width="wrap_content"
24         android:layout_height="wrap_content"
25         android:text="通知栏未打开"
26         android:textColor="#353535"
27         android:textSize="20sp"
28         android:textStyle="bold"
29         app:layout_constraintBottom_toTopOf="@+id/notify_dlg_content"
30         app:layout_constraintEnd_toEndOf="parent"
31         app:layout_constraintStart_toStartOf="parent"
32         app:layout_constraintTop_toTopOf="@+id/notify_dlg_close" />
33 
34     <View
35         android:id="@+id/bottom_line"
36         android:layout_width="0dp"
37         android:layout_height="2px"
38         android:background="@color/textNoFocus"
39         app:layout_constraintBottom_toTopOf="@+id/notify_alert_ok"
40         app:layout_constraintEnd_toEndOf="parent"
41         app:layout_constraintStart_toStartOf="parent"
42         app:layout_constraintTop_toBottomOf="@+id/notify_alert_icon" />
43 
44     <TextView
45         android:id="@+id/notify_dlg_content"
46         android:layout_width="0dp"
47         android:layout_height="72dp"
48         android:layout_marginStart="16dp"
49         android:layout_marginTop="16dp"
50         android:layout_marginEnd="16dp"
51         android:gravity="center"
52         android:text="通知栏可展示完整的警报功能,\n\n是否现在打开?"
53         android:textColor="#3a3a3a"
54         app:layout_constraintBottom_toTopOf="@+id/notify_alert_icon"
55         app:layout_constraintEnd_toEndOf="parent"
56         app:layout_constraintStart_toStartOf="parent"
57         app:layout_constraintTop_toBottomOf="@+id/notify_dlg_close" />
58 
59     <TextView
60         android:id="@+id/notify_alert_ok"
61         android:layout_width="0dp"
62         android:layout_height="64dp"
63         android:gravity="center"
64         android:text="去打开"
65         android:textColor="@color/notify_txt"
66         android:textStyle="bold"
67         app:layout_constraintBottom_toBottomOf="parent"
68         app:layout_constraintEnd_toEndOf="parent"
69         app:layout_constraintStart_toStartOf="parent"
70         app:layout_constraintTop_toBottomOf="@+id/bottom_line" />
71 
72     <ImageView
73         android:id="@+id/notify_alert_icon"
74         android:layout_width="72dp"
75         android:layout_height="72dp"
76         android:layout_marginTop="16dp"
77         android:layout_marginBottom="16dp"
78         app:layout_constraintBottom_toTopOf="@+id/bottom_line"
79         app:layout_constraintDimensionRatio="1"
80         app:layout_constraintEnd_toEndOf="parent"
81         app:layout_constraintStart_toStartOf="parent"
82         app:layout_constraintTop_toBottomOf="@+id/notify_dlg_content"
83         app:srcCompat="@drawable/ic_notify_toast" />
84 
85 </androidx.constraintlayout.widget.ConstraintLayout>

3.使用

1     fun notifyToast(){
2         val dlg = NotifyAlertDlg().apply { callback = this@SettingFrgmt::onDialogClicked }
3         dlg.show(requireFragmentManager(),"NotifyDlg")
4     }

 

posted @ 2015-07-05 19:10  f9q  阅读(621)  评论(0)    收藏  举报