(原创)自定义DialogFragment以及解决其内存泄漏问题

文章介绍了如何创建一个基础的自定义DialogFragment,包括设置入场和出场动画、显示位置、宽高等,并提供了简单的使用示例。同时,文章讨论了在使用过程中可能出现的内存泄漏问题,分析了原因,并提出了三种解决方法:设置引用为null、使用局部变量或采用弱引用。最后,文章提到了几个可能遇到的坑,如背景色修改、输入法显示时的位置问题以及转场动画的处理。

前言

日常开发中,dialog是常见的功能,我们时常需要弹出来一些弹框提示用户
今天就定义了一个方便的dialog基类BaseSimpleDialogFragment,
支持快速地显示一个dialog
主要功能有:
initAnimation:设置入场和出场动画
getGravity:设置dialog显示位置(屏幕上,中,下)
getCanceledOnTouchOutside:点击空白处关闭
getWindowWidth
getWindowHeight
getPaddingLeft:动态设置宽高和间距
整体来说比较简单,也方便扩展
创建dialog的时候只需要实现BaseSimpleDialogFragment即可
比如这样:

class MyDialog: BaseSimpleDialogFragment()  {
   
   

  override val layoutId: Int = R.layout.dialog_my_show

  companion object {
   
   
    @JvmStatic
    fun newInstance(): MyDialog {
   
   
      val dialog = MyDialog()
      dialog.arguments = Bundle().apply {
   
   
//      putParcelableArrayList(DATA, data)
      }
      return dialog
    }
  }


  override fun initData() {
   
   
//    data = arguments?.getParcelableArrayList(DATA) ?: return
  }

  override fun initView(view: View) {
   
   
    layoutView.findViewById<Button>(R.id.cancle).setOnClickListener {
   
   
      dismissAllowingStateLoss()
    }
  }
}

展示的时候几行代码就可以了:

      MyDialog.newInstance().apply {
   
   
        //传递数据
      }.show(supportFragmentManager)

源码

源码这边先贴出来:

abstract class BaseSimpleDialogFragment : DialogFragment() {
   
   

  abstract val layoutId: Int

  protected open fun initView(view: View) {
   
   
    //sonar
  }

  protected open fun initData() {
   
   
    //sonar
  }

  protected open fun initListener() {
   
   
    //sonar
  }

  lateinit var layoutView: View

  protected lateinit var mContext: Context


  override fun onAttach(context: Context) {
   
   
    super.onAttach(context)
    mContext = context
  }

  override fun onCreate(savedInstanceState: Bundle?) {
   
   
    super.onCreate(savedInstanceState)
    initAnimation()
  }


  override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
  ): View? {
   
   
    layoutView = inflater.inflate(layoutId, container, false)
    return layoutView
  }

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
   
   
    super.onViewCreated(view, savedInstanceState)
    initView(view)
    initListener()
    initData()
  }


  override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
   
   
    val dialog = super.onCreateDialog(savedInstanceState).apply {
   
   
      window?.run {
   
   
        decorView.setPadding(
          getPaddingLeft(),
          getPaddingTop(),
          getPaddingRight(),
          getPaddingBottom()
        )
        val wlp = attributes.apply {
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值