En mi aplicación, quiero mostrar un mensaje cuando se muestra un fragment .
¡ viewPager y BottomNavBar para mostrar 4 fragments !
Quiero que cuando haga clic en los elementos de BottomNavBar muestre un fragment y quiero que cuando el fragment de visibilidad muestre un mensaje .
Escribo a continuación los códigos:
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() } } } } En mis códigos anteriores, cuando haga clic en mi BottomNavBar para mostrar el fragment , muéstrame el mensaje de registro pero no muestre el mensaje Toast .
Cuando haga clic en otros elementos de BottomNavBar y vuelva a hacer clic en el elemento anterior de BottomNavBar , luego muestre el mensaje Toast .
Creo que la primera vez no inicializa el context en el método setUserVisibleHint .
¿Cómo puedo inicializar el context para mostrar Toast cada vez?
Cambié sus códigos con los siguientes códigos:
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) } } } Primero debe usar requireContext() en lugar de context() para evitar la pérdida de memoria.
Para mostrar Toast cada vez, puede inicializar el controlador en setUserVisibleHint , luego, después de un poco de retraso, ejecute su código.
espero ayudarte
Almacenar contexto en una variable es una práctica horrible y la mayoría de las veces conduce a pérdidas de memoria, use requireContext() , este método se introdujo en la Biblioteca de soporte 27.1.0. Hoy en día, lo más probable es que tenga una versión más nueva o que incluso use androidx , por lo que no hay excusa para almacenar un contexto.
Si está buscando el contexto de la aplicación para mostrar el mensaje de brindis, intente de la siguiente manera y vea si funciona. Además, inicialícelo en el método Crear para que tenga el contexto de la actividad en ese punto.
val appContext = context!!.applicationContext