web-dev-qa-db-fra.com

Comment utiliser setUserVisibleHint dans Fragment sur Android

Dans mon application, j'ai BottomNavBar et je veux afficher fragments lorsque je clique sur les éléments de ce BottomNavBar!
Pour définir ce fragments avec BottomNavBar j'ai utilisé NavigationGraph composant!

Je veux utiliser la méthode setUserVisibleHint pour l'une de ces fragment, mais quand afficher cette fragment pas appeler setUserVisibleHint!

Mes codes d'activité pour les éléments fragments à BottomNavBar:

class HomeActivity : BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    setupNavigation()

    }

        private fun setupNavigation() {
        val navController = Navigation.findNavController(this, R.id.homePage_fragmentNavHost)
        NavigationUI.setupWithNavController(homePage_bottomNavBar, navController)
    }

    override fun onSupportNavigateUp() = Navigation.findNavController(this, R.id.homePage_fragmentNavHost).navigateUp()
}

Mes codes de fragment:

class HomeDashboardFragment : Fragment(){

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home_dashboard, container, false)
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser) {
            Handler().postDelayed({ requireContext().toast("Show") }, 500)
        }
    }
}

Pourquoi ne pas travailler setUserVisibleHint dans fragment?

6
KokoBand
 @Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser){
        if (NetworkUtils.isConnected(getActivity())) {
            callYourApi();
        } 
    }
}
0
Samset

Utilisez BottomSheetBehavior https://developer.Android.com/reference/Android/support/design/widget/BottomSheetBehavior pour ce type d'implémentation. Vous pouvez également utiliser BottomSheetDialogFragment.

Pour définir un comportement spécifique, utilisez ce code, par exemple.

bottomSheetBehavior.setPeekHeight(300);
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
0
Vishal Pawar

Si vous utilisez Navigation , ce n'est peut-être pas la meilleure façon d'obtenir le comportement que vous désirez. La navigation a une interface OnDestinationChangedListener qui reçoit un rappel chaque fois que NavController.getCurrentDestination est appelé.

Heureusement, vous utilisez Kotlin et dans HomeActivity, vous pourrez peut-être vous en sortir avec quelque chose comme:

navController.addOnDestinationChangedListener { _, destination, _ ->
    Handler().postDelayed({ requireContext().toast("Show") }, 500)
}

Et vous devriez obtenir le résultat souhaité.

Si vous êtes nouveau dans la navigation, je recommanderais this codelab. Il passe par certaines des bases et peut vous aider à démarrer. Pour certains des concepts les plus avancés, vous pouvez consulter NavigationAdvancedSample sur Github.

Si vous souhaitez utiliser directement des fragments de toute façon, il serait probablement plus fiable d'utiliser les méthodes de cycle de vie (onStart) sur setUserVisibleHint ().

0
jeremybwoods