如何在 Android kotlin 上的片段中初始化上下文

新手上路,请多包涵

在我的应用程序中,我想在 fragment 显示时显示消息。

我使用 viewPagerBottomNavBar 显示 4 fragments

我想要点击 BottomNavBar 项目显示 fragment 我想要 可见性 fragment 显示消息

我写下面的代码:

 class HomeRegisteredFragment : Fragment() {

    lateinit var toolbarTile: TextView

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

        return inflater.inflate(R.layout.fragment_home_registered, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //Initialize
        activity?.let {
            toolbarTile = it.findViewById(R.id.homePage_toolbarTitle)
        }
        //Set title
        toolbarTile.text = resources.getString(R.string.registered)
        context?.let { ContextCompat.getColor(it, R.color.blue_active) }?.let {
            toolbarTile.setTextColor(it)
        }
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser) {
            Log.e("showFragLog", "Show")
            context?.let { Toast.makeText(it, "Show", Toast.LENGTH_SHORT).show() }
        }
    }
}

在我上面的代码中,当点击我的 BottomNavBar 显示 fragment 时,显示 Log 消息但不显示 Toast 消息。

当点击另一个 BottomNavBar 项目并再次点击上一个 BottomNavBar 项目时,然后显示 Toast 消息。

我认为第一次 没有初始化 context setUserVisibleHint 方法。

我如何初始化 context 每次都显示 Toast

原文由 Jake warton 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 655
2 个回答

我用以下代码更改了您的代码:

 class HomeRegisteredFragment : Fragment() {

    lateinit var toolbarTile: TextView
    lateinit var handler: Handler

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

        return inflater.inflate(R.layout.fragment_home_registered, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //Initialize
        activity?.let {
            toolbarTile = it.findViewById(R.id.homePage_toolbarTitle)
        }
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser) {
            //Initialize
            handler = Handler()
            //Set delay
            handler.postDelayed({
                Toast.makeText(requireContext(),"Show",Toast.LENGTH_SHORT).show()
            }, 10)
        }
    }
}

首先,您应该使用 requireContext() 而不是 context() 以避免内存泄漏。

对于每次显示 Toast,您可以在 setUserVisibleHint 中初始化处理程序,然后在延迟一段时间后运行您的代码!

希望对你有帮助

原文由 Mohammad Nouri 发布,翻译遵循 CC BY-SA 4.0 许可协议

在变量中存储上下文是一种可怕的做法,大多数时候会导致内存泄漏,使用 requireContext() 这个方法是在支持库 27.1.0 中引入的。现在你很可能会有一个更新的版本,甚至使用 androidx ,所以没有理由存储上下文

原文由 Juan Hurtado 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题