android-fragments 如何在AndroidKotlin上初始化片段中的上下文

q43xntqr  于 2022-11-14  发布在  Android
关注(0)|答案(4)|浏览(161)

在我的应用程序中,我想在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时,显示日志消息,但不显示吐司消息。
当单击另一个BottomNavBar项目并再次单击上一个BottomNavBar项目时,则显示Toast消息。
我认为在第一次没有在setUserVisibleHint方法中初始化context
我如何在每次都初始化context以显示吐司

yr9zkbsy

yr9zkbsy1#

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

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()**,以避免内存泄漏。
对于show吐司for every time,您可以在setUserVisibleHint中初始化处理程序,然后在一些延迟之后运行您的代码!
我希望能帮到你

ijxebb2r

ijxebb2r2#

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

3df52oht

3df52oht3#

如果 您 正在 寻找 应用 程序 上下文 来 显示 toast 消息 , 请 尝试 以下 方法 , 看看 它 是否 有效 。 另外 , 初始 化 onCreate 方法 , 以便 在 此时 获得 Activity 上下文 。

val appContext = context!!.applicationContext

中 的 每 一 个

myss37ts

myss37ts4#

我在这里也遇到了类似的问题。我有一个带有多个片段的Activity,我需要一个ListView来显示一些雇员。但是当我调用Adapter类时,我不知道如何传递上下文变量:

binding.listviewCoordenacoes.isClickable = true
    binding.listviewCoordenacoes.adapter = CoordenadorAdapter(requireContext().applicationContext as Activity, arrayListCoordenador)
    binding.listviewCoordenacoes.setOnClickListener{}

在一般的例子中,它在活动中工作。如果不可能,我将创建一个活动并将其放在其中。

相关问题