【问题标题】:How to initialize context in fragment on Android kotlin如何在 Android kotlin 上的片段中初始化上下文
【发布时间】:2019-08-19 11:47:56
【问题描述】:

在我的应用程序中,我想在 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 时,显示日志消息但不显示 Toast 消息。
当单击另一个 BottomNavBar 项目并再次单击上一个 BottomNavBar 项目时,然后显示 Toast 消息。

我认为在第一次 not initialize context in setUserVisibleHint 方法。

我如何每次都初始化context for show Toast

【问题讨论】:

    标签: android android-fragments kotlin android-context


    【解决方案1】:

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

    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 中初始化处理程序,然后在延迟一段时间后运行您的代码!

    希望对你有帮助

    【讨论】:

    • 这段代码帮助我能够看到我需要将我的代码放在创建时
    • @TonyMerritt,你可以使用onCreateView方法
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您正在寻找应用程序上下文来显示 toast 消息,请尝试以下方式,看看它是否有效。此外,将其初始化为 onCreate 方法,以便您在此时拥有活动上下文。

      val appContext = context!!.applicationContext
      

      【讨论】:

        猜你喜欢
        • 2020-10-25
        • 1970-01-01
        • 2015-09-19
        • 1970-01-01
        • 2020-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-02
        相关资源
        最近更新 更多