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 }