110 votes

Cycle de vie des fragments - quelle méthode est appelée lors de l'affichage ou du masquage ?

J'utilise la méthode suivante pour passer d'un fragment à l'autre (dans mon tiroir de navigation) en les affichant ou en les masquant.

protected void showFragment(int container, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        if ( lastTag != null && !lastTag.equals("")) {
            Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag );
            if ( lastFragment != null ) {
                transaction.hide( lastFragment );
            }
        }

        if ( fragment.isAdded() ) {
            transaction.show( fragment );
        }
        else {
            transaction.add( container, fragment, tag );
        }

        if ( addToBackStack ) {
            transaction.addToBackStack( tag );
        }

        transaction.commit();

        // set the active tag
        activeFragTag = tag;
    }

Ce que je ne sais pas, c'est quelle méthode du cycle de vie des fragments est appelée lorsque je les affiche ou les cache ? (comme il n'y a pas de méthode telle que onShow() ou onHide(), je ne sais pas trop quoi utiliser). Je veux effectuer des actions spécifiques lors de l'affichage et du masquage d'un certain fragment.

130voto

beworker Points 5834

Similaire au cycle de vie des activités, Android appelle onStart() lorsque le fragment devient visible. onStop() est normalement appelé lorsque le fragment devient invisible, mais il peut aussi être appelé plus tard dans le temps.

Selon la mise en page, Android peut appeler onStart() même, lorsque votre Fragment n'est pas encore visible, mais qu'il appartient à un conteneur parent visible. Par exemple, ceci est valable pour android.support.v4.view.ViewPager qui vous oblige à passer outre Fragment.setUserVisibleHint() méthode. Dans tous les cas, si vous avez besoin d'enregistrer/désenregistrer des BroadcastReceivers ou d'autres listeners, vous pouvez utiliser en toute sécurité la méthode onStart() y onStop() car elles seront toujours appelées.

Note : Certains conteneurs de fragments peuvent garder des fragments invisibles lancés. Pour gérer cette situation, vous pouvez surcharger Fragment.onHiddenChanged(boolean hidden) . Selon le documentation un fragment doit être à la fois commencé et visible (non caché) pour être visible par l'utilisateur.

Mise à jour : Si vous utilisez android.support.v4.widget.DrawerLayout alors un fragment sous le tiroir reste démarré et visible même lorsque le tiroir est ouvert. Dans ce cas, vous devez utiliser DrawerLayout.setDrawerListener() et écoutez onDrawerClosed() y onDrawerOpened() les rappels.

79voto

s1rius Points 806

J'ai @Override cette méthode et résolu mon problème :

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (hidden) {
        //do when hidden
    } else {
       //do when show
    }
}

36voto

Biraj Zalavadia Points 9272

Bien sûr, vous pouvez @Override la méthode suivante pour le faire :

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            // Do your Work
        } else {
            // Do your Work
        }
    }

4voto

hoi Points 1440

Vous pouvez utiliser "onCreateView" (ou "onActivityCreated") et "onHiddenChanged". Utilisez "onCreateView" pour la première présentation et "onHiddenChanged" pour les présentations ultérieures. L'option "setMenuVisibility" n'est pas appelée sur le contrôle de transaction.

@Override
public View OnCreateView() {
   // fragment will show first
}

@Override
public void onHiddenChanged(boolean hidden) {
    if (!hidden) {
        // fragment will show 
    }
    else {
        // fragment will hide
    }
}

3voto

Alan Yuan Points 41

Le comportement du fragment dans le view pager est différent de celui du conteneur de fragment ordinaire.

Essayez ce code :

    boolean mIsVisibleToUser;

    /**
     * is visible to user
     */
    public void show() {
        //do when show
    }

    /**
     * is invisible to user
     */
    public void hide() {
        //do when gone
    }

    @Override
    public void onResume() {
        super.onResume();
        if (!mIsVisibleToUser && getUserVisibleHint()) {
            mIsVisibleToUser = true;
            show();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (mIsVisibleToUser && getUserVisibleHint()) {
            mIsVisibleToUser = false;
            hide();
        }
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isResumed()) {
            if (mIsVisibleToUser != isVisibleToUser) {
                mIsVisibleToUser = isVisibleToUser;
                if (isVisibleToUser) show();
                else hide();
            }
        }
    }

    public boolean isVisibleToUser() {
        return mIsVisibleToUser;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X