1
votes

Comment initialiser le contexte dans un fragment sur Android Kotlin

Dans mon application, je veux afficher le message lorsque fragment l'affiche.
J'ai utilisé viewPager et BottomNavBar pour afficher 4 fragments !
Je veux lorsque je clique sur les éléments BottomNavBar afficher fragment et je veux quand visibilité fragment afficher le message fort>.
J'écris les codes ci-dessous:

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() }
        }
    }
}

Dans mes codes ci-dessus, quand cliquez sur mon BottomNavBar pour afficher le fragment , montrez-moi le message du journal mais pas afficher le message Toast .
Lorsque vous cliquez sur un autre élément BottomNavBar et cliquez à nouveau sur l'élément BottomNavBar précédent, puis affichez le message Toast .

Je pense que la première fois, ne pas initialiser le contexte dans la méthode setUserVisibleHint .

Comment puis-je initialiser contexte pour afficher Toast à chaque fois?


0 commentaires

3 Réponses :


0
votes

Si vous recherchez un contexte d'application pour afficher le message toast, essayez la méthode ci-dessous et voyez si cela fonctionne. En outre, initialisez-la méthode onCreate afin d'avoir le contexte d'activité à ce stade.

val appContext = context !!. applicationContext


0 commentaires

2
votes

Le stockage du contexte dans une variable est une pratique horrible et la plupart du temps conduit à des fuites de mémoire, utilisez requireContext () cette méthode a été introduite dans la bibliothèque de support 27.1.0. De nos jours, vous aurez très probablement une version plus récente ou même utilisant androidx , il n'y a donc aucune excuse pour stocker un contexte


0 commentaires

11
votes

J'ai changé vos codes avec les codes ci-dessous:

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)
        }
    }
}

Vous devez d'abord utiliser requireContext() au lieu de context () pour éviter les fuites de mémoire.
Pour afficher Toast à chaque fois, vous pouvez initialiser le gestionnaire dans setUserVisibleHint , puis après un certain délai, exécutez votre code!

J'espère vous aider


2 commentaires

Ce code m'a aidé en ce que j'ai pu voir que j'avais besoin de mettre mon code dans le sur créé


@TonyMerritt, vous pouvez utiliser la méthode onCreateView