视图绑定返回 null

发布于 2025-01-11 07:33:49 字数 1264 浏览 0 评论 0原文

在底部工作表对话框中

class XBottomSheet () : BottomSheetDialogFragment() {

    private var _binding: XBottomSheetBinding? = null
    private val binding get() = _binding!!
    private var handlerRunner: Runnable? = null
    private val handler = Handler(Looper.getMainLooper())

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = XBottomSheetBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        handlerRunner = Runnable {
            binding.tvTimeOffer.text = "text"
       }
       
       handler.postDelayed(handlerRunner!!, 1)
    }


    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null

        handlerRunner?.apply {
            handler.removeCallbacks(this)
        }
    }
}

在某些手机中 Firebase carashlytics 日志 private val binding get() = _binding!! Non-fatal Exception: java.lang.NullPointerException

有时,可以处理程序在设置 _binding = null 后先调用可运行对象,然后再删除它?

我不知道为什么!

In the Bottom sheet dialog

class XBottomSheet () : BottomSheetDialogFragment() {

    private var _binding: XBottomSheetBinding? = null
    private val binding get() = _binding!!
    private var handlerRunner: Runnable? = null
    private val handler = Handler(Looper.getMainLooper())

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = XBottomSheetBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        handlerRunner = Runnable {
            binding.tvTimeOffer.text = "text"
       }
       
       handler.postDelayed(handlerRunner!!, 1)
    }


    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null

        handlerRunner?.apply {
            handler.removeCallbacks(this)
        }
    }
}

In some phones Firebase carashlytics logs private val binding get() = _binding!! Non-fatal Exception: java.lang.NullPointerException

At some time, can the handler call the runnable before removing it after setting _binding = null ??

I don't know why that!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

三岁铭 2025-01-18 07:33:49

在绑定获取 null 之前删除处理程序回调
正确的方法

override fun onDestroyView() {
        super.onDestroyView()
        handler?.removeCallbacks(this)
        _binding = null
    }

Remove handler callbacks before binding gets null
Correct way

override fun onDestroyView() {
        super.onDestroyView()
        handler?.removeCallbacks(this)
        _binding = null
    }
橘和柠 2025-01-18 07:33:49

您应该使用 DataBinding

class XBottomSheetFragment () : BottomSheetDialogFragment() {

private lateinit var binding: XBottomSheetBinding
private var handlerRunner: Runnable? = null
private val handler = Handler(Looper.getMainLooper())

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

binding = DataBindingUtil.inflate(inflater, R.layout.fragment_x_bottomsheet, container, false)
        return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    handlerRunner = Runnable {
        binding.tvTimeOffer.text = "text"
   }
   
   handler.postDelayed(handlerRunner!!, 1)
}


override fun onDestroyView() {
    super.onDestroyView() 

    handlerRunner?.apply {
        handler.removeCallbacks(this)
    }
}

}

从 xml 布局中,通过布局标记封装您的工作:

<layout>
<--- your layout design --->
</layout>

PS 始终在类名末尾命名您的类类别,以便于搜索和维护

You should use DataBinding instead

class XBottomSheetFragment () : BottomSheetDialogFragment() {

private lateinit var binding: XBottomSheetBinding
private var handlerRunner: Runnable? = null
private val handler = Handler(Looper.getMainLooper())

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

binding = DataBindingUtil.inflate(inflater, R.layout.fragment_x_bottomsheet, container, false)
        return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    handlerRunner = Runnable {
        binding.tvTimeOffer.text = "text"
   }
   
   handler.postDelayed(handlerRunner!!, 1)
}


override fun onDestroyView() {
    super.onDestroyView() 

    handlerRunner?.apply {
        handler.removeCallbacks(this)
    }
}

}

From xml layout, encapsulate your work by layout tag :

<layout>
<--- your layout design --->
</layout>

P.S. always name your category of class at the end of your classname for easy search and maintenance

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文