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
?
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser){
if (NetworkUtils.isConnected(getActivity())) {
callYourApi();
}
}
}
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);
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 ().