Jak określić, kiedy Fragment staje się widoczny w ViewPager

Problem: Fragment onResume() W ViewPager zostanie wywołany zanim fragment stanie się rzeczywiście widoczny.

Na przykład mam 2 fragmenty z ViewPager i FragmentPagerAdapter. Drugi fragment jest dostępny tylko dla uprawnionych użytkowników i muszę poprosić Użytkownika o zalogowanie się, gdy fragment stanie się widoczny (za pomocą okna dialogowego alert).

Ale ViewPager tworzy drugi fragment, gdy pierwszy jest widoczny, aby buforować drugi fragment i czyni go widocznym, gdy użytkownik zaczyna przesuwać.

Więc Zdarzenie onResume() jest wywoływane w drugim fragmencie na długo zanim stanie się widoczne. Dlatego staram się znaleźć zdarzenie, które zostanie wywołane, gdy drugi fragment stanie się widoczny, aby wyświetlić okno dialogowe w odpowiednim momencie.

Jak można to zrobić?

Author: Joe Schneider, 2012-04-05

21 answers

UPDATE : Android Support Library (rev 11) wreszcie naprawiono problem z widoczną podpowiedzią użytkownika , teraz jeśli używasz biblioteki wsparcia dla fragmentów, możesz bezpiecznie użyć getUserVisibleHint() lub zastąpić setUserVisibleHint(), aby uchwycić zmiany, jak opisano w odpowiedzi Gorna.

UPDATE 1 Oto jeden mały problem z getUserVisibleHint(). Wartość ta jest domyślnie true.

// Hint provided by the app that this fragment is currently visible to the user.
boolean mUserVisibleHint = true;

Więc może być problem, gdy spróbujesz go użyć przed wywołaniem setUserVisibleHint(). Jako obejście można ustawić wartość w metodzie onCreate takiej jak ta.

public void onCreate(@Nullable Bundle savedInstanceState) {
    setUserVisibleHint(false);

Nieaktualna odpowiedź:

W większości przypadków ViewPager pokazuje tylko jedną stronę na raz, ale wstępnie buforowane fragmenty są również wprowadzane do stanu "widzialnego" (w rzeczywistości niewidocznego), jeśli używasz FragmentStatePagerAdapter w Android Support Library pre-r11.

Nadpisuję:

public class MyFragment extends Fragment {
    @Override
    public void setMenuVisibility(final boolean visible) {
        super.setMenuVisibility(visible);
        if (visible) {
            // ...
        }
    }
   // ...
}

Aby uchwycić stan skupienia fragmentu, który moim zdaniem jest najbardziej odpowiednim stanem "widoczności", ponieważ tylko jeden fragment w Viewpagerze może faktycznie umieścić swoje pozycje menu wraz z elementami aktywności rodzica.

 477
Author: Oasis Feng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-04 23:42:08

Jak określić, kiedy Fragment staje się widoczny w ViewPager

Możesz wykonać następujące czynności poprzez nadpisanie setUserVisibleHint w twoim Fragment:

public class MyFragment extends Fragment {
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
        }
        else {
        }
    }
}
 528
Author: gorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-15 18:11:35

To wydaje się przywracać normalne onResume() zachowanie, którego można się spodziewać. Gra dobrze z naciśnięciem klawisza home, aby opuścić aplikację, a następnie ponownie wprowadzić aplikację. onResume() nie jest wywoływany dwa razy z rzędu.

@Override
public void setUserVisibleHint(boolean visible)
{
    super.setUserVisibleHint(visible);
    if (visible && isResumed())
    {
        //Only manually call onResume if fragment is already visible
        //Otherwise allow natural fragment lifecycle to call onResume
        onResume();
    }
}

@Override
public void onResume()
{
    super.onResume();
    if (!getUserVisibleHint())
    {
        return;
    }

    //INSERT CUSTOM CODE HERE
}
 112
Author: craigrs84,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 12:42:51

Oto inny sposób użycia onPageChangeListener:

  ViewPager pager = (ViewPager) findByViewId(R.id.viewpager);
  FragmentPagerAdapter adapter = new FragmentPageAdapter(getFragmentManager);
  pager.setAdapter(adapter);
  pager.setOnPageChangeListener(new OnPageChangeListener() {

  public void onPageSelected(int pageNumber) {
    // Just define a callback method in your fragment and call it like this! 
    adapter.getItem(pageNumber).imVisible();

  }

  public void onPageScrolled(int arg0, float arg1, int arg2) {
    // TODO Auto-generated method stub

  }

  public void onPageScrollStateChanged(int arg0) {
    // TODO Auto-generated method stub

  }
});
 57
Author: Ostkontentitan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 12:43:17

setUserVisibleHint() nazywa się czasami przed onCreateView() i czasami po tym powoduje kłopoty.

Aby to przezwyciężyć, musisz sprawdzić isResumed(), jak również wewnątrz setUserVisibleHint() metody. Ale w tym przypadku zdałem sobie sprawę, że {[2] } zostanie wywołany tylko jeśli Fragment zostanie wznowiony i widoczny, a nie gdy zostanie utworzony.

Więc jeśli chcesz coś zaktualizować, gdy Fragment jest visible, Umieść funkcję aktualizacji zarówno w onCreate(), jak i setUserVisibleHint():

@Override
public View onCreateView(...){
    ...
    myUIUpdate();
    ...        
}
  ....
@Override
public void setUserVisibleHint(boolean visible){
    super.setUserVisibleHint(visible);
    if (visible && isResumed()){
        myUIUpdate();
    }
}

UPDATE: still I realized myUIUpdate() gets wywołany dwukrotnie czasami, powodem jest to, że jeśli masz 3 karty i ten kod jest na 2.karcie, po pierwszym otwarciu 1. Karty, 2. karta jest również tworzony, nawet nie jest widoczny i myUIUpdate() jest wywoływany. Następnie, gdy przesuniesz palcem do 2. zakładki, myUIUpdate() z if (visible && isResumed()) zostanie wywołana i w rezultacie myUIUpdate() może zostać wywołana dwa razy w ciągu sekundy.

Drugi problem to !visible W setUserVisibleHint zostanie wywołany zarówno 1) po wyjściu z ekranu fragment, jak i 2) przed jego utworzeniem, gdy najpierw przełączysz się na ekran fragment czas.

Rozwiązanie:

private boolean fragmentResume=false;
private boolean fragmentVisible=false;
private boolean fragmentOnCreated=false;
...

@Override
public View onCreateView(...){
    ...
    //Initialize variables
    if (!fragmentResume && fragmentVisible){   //only when first time fragment is created
        myUIUpdate();
    }
    ...        
}

@Override
public void setUserVisibleHint(boolean visible){
    super.setUserVisibleHint(visible);
    if (visible && isResumed()){   // only at fragment screen is resumed
        fragmentResume=true;
        fragmentVisible=false;
        fragmentOnCreated=true;
        myUIUpdate();
    }else  if (visible){        // only at fragment onCreated
        fragmentResume=false;
        fragmentVisible=true;
        fragmentOnCreated=true;
    }
    else if(!visible && fragmentOnCreated){// only when you go out of fragment screen
        fragmentVisible=false;
        fragmentResume=false;
    }
}

Explanation:

fragmentResume,fragmentVisible: upewnia się, że myUIUpdate() in {[3] } jest wywoływany tylko wtedy, gdy fragment jest tworzony i widoczny, a nie podczas wznawiania. Rozwiązuje również problem, gdy jesteś na 1. karcie, 2. karta jest tworzona, nawet jeśli nie jest widoczna. Rozwiązuje to problem i sprawdza, czy fragment screen jest widoczny, gdy onCreate.

fragmentOnCreated: upewnia się, że fragment nie jest widoczny i nie jest wywoływany podczas tworzenia fragmentu po raz pierwszy. Więc teraz to jeśli klauzula zostanie wywołana tylko po przesunięciu z fragmentu.

Aktualizacja Możesz umieścić cały ten kod w BaseFragment kod w ten sposób i nadpisać metodę.

 51
Author: Jemshit Iskenderov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-01 12:23:06
package com.example.com.ui.fragment;


import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.com.R;

public class SubscribeFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_subscribe, container, false);
        return view;
    }

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

        if (isVisibleToUser) {
            // called here
        }
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }
}
 23
Author: w3hacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 02:33:43

Override setPrimaryItem() w podklasie FragmentPagerAdapter. Używam tej metody i działa dobrze.

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
    // This is what calls setMenuVisibility() on the fragments
    super.setPrimaryItem(container, position, object);

    if (object instanceof MyWhizBangFragment) {
        MyWhizBangFragment fragment = (MyWhizBangFragment) object;
        fragment.doTheThingYouNeedToDoOnBecomingVisible();
    }
}
 14
Author: kris larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-15 18:17:08

Override Fragment.onHiddenChanged() za to.

public void onHiddenChanged(boolean hidden)

Wywołane, gdy stan ukryty (zwracany przez isHidden()) fragment uległ zmianie. Fragmenty zaczynają się nie Ukryte; będzie to wywoływane za każdym razem, gdy fragment zmieni stan.

Parametry
hidden - boolean: True, jeśli fragment jest teraz ukryty, false, jeśli nie jest widoczny.

 10
Author: dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-13 10:45:48

Aby wykryć Fragment W ViewPager widocznym, jestem pewien, że tylko za pomocą setUserVisibleHint to za mało.
Oto moje rozwiązanie dla zaznacz fragment widoczny, niewidoczny przy pierwszym uruchomieniu viewpagera, przełączanie między stroną, przejście do innej aktywności/ fragmentu/tła / pierwszego planu "

public class BaseFragmentHelpLoadDataWhenVisible extends Fragment {
    protected boolean mIsVisibleToUser; // you can see this variable may absolutely <=> getUserVisibleHint() but it not. Currently, after many test I find that

    /**
     * This method will call when viewpager create fragment and when we go to this fragment from
     * background or another activity, fragment
     * NOT call when we switch between each page in ViewPager
     */
    @Override
    public void onStart() {
        super.onStart();
        if (mIsVisibleToUser) {
            onVisible();
        }
    }

    @Override
    public void onStop() {
        super.onStop();
        if (mIsVisibleToUser) {
            onInVisible();
        }
    }

    /**
     * This method will call at first time viewpager created and when we switch between each page
     * NOT called when we go to background or another activity (fragment) when we go back
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        mIsVisibleToUser = isVisibleToUser;
        if (isResumed()) { // fragment have created
            if (mIsVisibleToUser) {
                onVisible();
            } else {
                onInVisible();
            }
        }
    }

    public void onVisible() {
        Toast.makeText(getActivity(), TAG + "visible", Toast.LENGTH_SHORT).show();
    }

    public void onInVisible() {
        Toast.makeText(getActivity(), TAG + "invisible", Toast.LENGTH_SHORT).show();
    }
}

Wyjaśnienie Możesz dokładnie sprawdzić poniższy logcat, a następnie myślę, że możesz wiedzieć, dlaczego to rozwiązanie będzie działać

Pierwsze uruchomienie

Fragment1: setUserVisibleHint: isVisibleToUser=false isResumed=false
Fragment2: setUserVisibleHint: isVisibleToUser=false isResumed=false
Fragment3: setUserVisibleHint: isVisibleToUser=false isResumed=false
Fragment1: setUserVisibleHint: isVisibleToUser=true isResumed=false // AT THIS TIME isVisibleToUser=true but fragment still not created. If you do something with View here, you will receive exception
Fragment1: onCreateView
Fragment1: onStart mIsVisibleToUser=true
Fragment2: onCreateView
Fragment3: onCreateView
Fragment2: onStart mIsVisibleToUser=false
Fragment3: onStart mIsVisibleToUser=false

Przejdź do page2

Fragment1: setUserVisibleHint: isVisibleToUser=false isResumed=true
Fragment2: setUserVisibleHint: isVisibleToUser=true isResumed=true

Idź do page3

Fragment2: setUserVisibleHint: isVisibleToUser=false isResumed=true
Fragment3: setUserVisibleHint: isVisibleToUser=true isResumed=true

Przejdź do tła:

Fragment1: onStop mIsVisibleToUser=false
Fragment2: onStop mIsVisibleToUser=false
Fragment3: onStop mIsVisibleToUser=true

Idź na pierwszy plan

Fragment1: onStart mIsVisibleToUser=false
Fragment2: onStart mIsVisibleToUser=false
Fragment3: onStart mIsVisibleToUser=true

Projekt DEMO tutaj

Hope it help

 10
Author: Phan Van Linh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-13 09:25:06

Zorientowałem się, że onCreateOptionsMenu i onPrepareOptionsMenu Metody wywołane tylko w przypadku fragmentu naprawdę widoczne. Nie mogłem znaleźć żadnej metody, która zachowuje się tak, również próbowałem OnPageChangeListener, ale to nie działa w sytuacjach, na przykład, potrzebuję zmiennej zainicjalizowanej w metodzie onCreate.

Więc te dwie metody mogą być wykorzystane w tym problemie jako obejście, szczególnie dla małych i krótkich zadań.

Myślę, że to lepsze rozwiązanie, ale nie najlepsze. Użyję tego, ale poczekaj. dla lepszego rozwiązania w tym samym czasie. Pozdrawiam.
 4
Author: ismailarilik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-24 08:20:46

Inne rozwiązanie opublikowane tutaj nadpisanie setPrimaryItem w pageradapterze przez Krisa Larsona prawie mi się udało. Ale ta metoda jest wywoływana wiele razy dla każdej konfiguracji. Też dostałem NPE z odsłon itp. we fragmencie, ponieważ ten nie jest gotowy, pierwsze kilka razy ta metoda jest wywoływana. Z następującymi zmianami to działało dla mnie:

private int mCurrentPosition = -1;

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
    super.setPrimaryItem(container, position, object);

    if (position == mCurrentPosition) {
        return;
    }

    if (object instanceof MyWhizBangFragment) {
        MyWhizBangFragment fragment = (MyWhizBangFragment) object;

        if (fragment.isResumed()) {
            mCurrentPosition = position;
            fragment.doTheThingYouNeedToDoOnBecomingVisible();
        }
    }
}
 2
Author: Gober,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:43

Dodaj następujący kod wewnątrz fragmentu

@Override
public void setMenuVisibility(final boolean visible) 
 {
    super.setMenuVisibility(visible);
    if (visible && isResumed()) 
     {

     }
}
 2
Author: Afzaal Iftikhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-02 18:24:31

Napotkałem ten sam problem podczas pracy z FragmentStatePagerAdapters i 3 zakładkami. Musiałem pokazać Dilaog za każdym razem, gdy pierwsza karta została kliknięta i ukryć ją po kliknięciu innych kart.

Samo nadpisanie setUserVisibleHint() nie pomogło znaleźć obecnego widocznego fragmentu.

Po kliknięciu z 3. Zakładki - - - - - > 1. Zakładka. Uruchomił się dwukrotnie dla 2. fragmentu i dla 1. fragmentu. Połączyłem go z metodą isResumed ().

    @Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    isVisible = isVisibleToUser;

    // Make sure that fragment is currently visible
    if (!isVisible && isResumed()) {
        // Call code when Fragment not visible
    } else if (isVisible && isResumed()) {
       // Call code when Fragment becomes visible.
    }

}
 2
Author: Aman Arora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-13 11:36:31

Mamy specjalny przypadek z MVP, gdzie fragment musi powiadomić prezentera, że widok stał się widoczny, a prezenter jest wstrzykiwany przez Dagger w fragment.onAttach().

setUserVisibleHint() to za mało, wykryliśmy 3 różne przypadki, które wymagały rozwiązania (onAttach() jest wspomniane, abyś wiedział, kiedy prezenter jest dostępny):

  1. Fragment właśnie został utworzony. System wykonuje następujące wywołania:

    setUserVisibleHint() // before fragment's lifecycle calls, so presenter is null
    onAttach()
    ...
    onResume()
    
  2. Fragment już utworzony i Dom przycisk jest wciśnięty. Podczas przywracania aplikacji na pierwszy plan nazywa się to:

    onResume()
    
  3. Zmiana orientacji:

    onAttach() // presenter available
    onResume()
    setUserVisibleHint()
    

Chcemy, aby wskazówka widoczności dotarła do prezentera tylko raz, więc tak to robimy:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.fragment_list, container, false);
    setHasOptionsMenu(true);

    if (savedInstanceState != null) {
        lastOrientation = savedInstanceState.getInt(STATE_LAST_ORIENTATION,
              getResources().getConfiguration().orientation);
    } else {
        lastOrientation = getResources().getConfiguration().orientation;
    }

    return root;
}

@Override
public void onResume() {
    super.onResume();
    presenter.onResume();

    int orientation = getResources().getConfiguration().orientation;
    if (orientation == lastOrientation) {
        if (getUserVisibleHint()) {
            presenter.onViewBecomesVisible();
        }
    }
    lastOrientation = orientation;
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (presenter != null && isResumed() && isVisibleToUser) {
        presenter.onViewBecomesVisible();
    }
}

@Override public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt(STATE_LAST_ORIENTATION, lastOrientation);
}
 2
Author: Pin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-08 15:30:26

Wykrywanie przez focused view!

To działa dla mnie

public static boolean isFragmentVisible(Fragment fragment) {
    Activity activity = fragment.getActivity();
    View focusedView = fragment.getView().findFocus();
    return activity != null
            && focusedView != null
            && focusedView == activity.getWindow().getDecorView().findFocus();
}
 2
Author: Mohammad Reza Norouzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-19 21:06:32

Zauważ, że setUserVisibleHint(false) nie jest wywoływany przy zatrzymaniu activity / fragment. Nadal będziesz musiał sprawdzić start/stop, aby poprawnie register/unregister wszystkie słuchacze / etc.

Otrzymasz również setUserVisibleHint(false), Jeśli twój fragment zaczyna się w stanie niewidocznym; nie chcesz tam unregister, ponieważ nigdy wcześniej nie zarejestrowałeś się w tym przypadku.

@Override
public void onStart() {
    super.onStart();

    if (getUserVisibleHint()) {
        // register
    }
}

@Override
public void onStop() {
    if (getUserVisibleHint()) {
        // unregister
    }

    super.onStop();
}

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

    if (isVisibleToUser && isResumed()) {
        // register

        if (!mHasBeenVisible) {
            mHasBeenVisible = true;
        }
    } else if (mHasBeenVisible){
        // unregister
    }
}
 1
Author: elevenfive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 12:42:21

Napotkałem ten problem, gdy próbowałem uruchomić timer, gdy fragment w viewpagerze był na ekranie, aby użytkownik mógł go zobaczyć.

Timer zawsze uruchamiał się tuż przed wyświetlaniem fragmentu przez użytkownika. Dzieje się tak, ponieważ metoda onResume() we fragmencie jest wywołana, zanim będziemy mogli zobaczyć fragment.

Moim rozwiązaniem było sprawdzenie metodą onResume(). Chciałem wywołać pewną metodę ' foo ()', gdy fragment 8 był bieżącym fragmentem widoku pagerów.

@Override
public void onResume() {
    super.onResume();
    if(viewPager.getCurrentItem() == 8){
        foo();
        //Your code here. Executed when fragment is seen by user.
    }
}
Mam nadzieję, że to pomoże. Często widziałem ten problem. To chyba najprostsze rozwiązanie, jakie widziałem. Wiele innych nie jest kompatybilnych z niższymi interfejsami API itp.
 1
Author: Malone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 12:42:33

Miałem ten sam problem. ViewPager wykonuje inne zdarzenia cyklu życia fragmentu i nie mogłem zmienić tego zachowania. Napisałem prosty pager z wykorzystaniem fragmentów i dostępnych animacji. SimplePager

 1
Author: Rukmal Dias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 12:43:07

Spróbuj tego, to dla mnie praca:

@Override
public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);

        if (hidden) {

        }else
        {}
    }
 0
Author: Kyo Huu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-08 05:08:11

Użyłem tego i zadziałało !

mContext.getWindow().getDecorView().isShown() //boolean
 0
Author: Ali Akram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-21 10:57:28

Nadpisuję metodę Count z powiązanego FragmentStatePagerAdapter i każę zwrócić całkowitą liczbę pomniejszoną o liczbę stron do ukrycia:

 public class MyAdapter : Android.Support.V13.App.FragmentStatePagerAdapter
 {   
     private List<Fragment> _fragments;

     public int TrimmedPages { get; set; }

     public MyAdapter(Android.App.FragmentManager fm) : base(fm) { }

     public MyAdapter(Android.App.FragmentManager fm, List<Android.App.Fragment> fragments) : base(fm)
     {
         _fragments = fragments;

         TrimmedPages = 0;
     }

     public override int Count
     {
         //get { return _fragments.Count; }
         get { return _fragments.Count - TrimmedPages; }
     }
 }

Tak więc, jeśli do Viewpagera są początkowo dodane 3 fragmenty i tylko pierwsze 2 powinny być wyświetlane, dopóki nie zostanie spełniony jakiś warunek, Nadpisz liczbę stron, ustawiając TrimmedPages na 1 i powinien wyświetlać tylko dwie pierwsze strony.

To działa dobrze dla stron na końcu, ale naprawdę nie pomoże dla tych na początku lub środkowy (choć jest na to wiele sposobów).

 -3
Author: samis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-11 21:44:24