wake-up-neo.com

ViewPager-Aufruf setUserVisibleHint nach dem Laden des ersten Fragments

In meiner Anwendung habe ich einen ViewPager, der viele ausklappbare Registerkarten mit Fragmenten enthält. Ich verwende die setUserVisibleHint-Methode, um zu erkennen, wann eine Fragment auf dem Bildschirm erscheint. Dies funktioniert hervorragend, wenn der Benutzer zwischen Registerkarten wechselt, beim ersten Laden jedoch nicht. Um den Code in der Methode auszuführen, muss ich nach links und dann zurück zur ersten Fragment ziehen, da die setUserVisibleHint-Methode vor der onCreateView-Methode aufgerufen wird. 

Haben Sie Ideen, wie ich diesen Code ausführen kann, nachdem das erste Fragment sichtbar ist? Gibt es eine Methode in der ViewPager oder etwas anderes?

39
Cilenco

Sie können (und sollten) sich nicht auf setUserVisibleHint verlassen. Stattdessen sollten Sie einen ViewPager.OnPageChangeListener verwenden, um Rückrufe abzurufen, wenn eine Seite sichtbar wird. Z.B.

viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        // do your work
    } 
});

Note: Sie können ViewPager.SimpleOnPageChangeListener verwenden, wenn Sie nicht auf alle Rückrufe warten müssen.

Aktualisieren

Die setOnPageChangeListener-Methode ist jetzt veraltet, verwenden Sie stattdessen addOnPageChangeListener

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        // do your work
    } 
});
58
Paul Burke

UNTER WERDEN FÜR MICH ARBEITET

Bitte erstellen Sie eine globale Ansicht wie diese

View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {
        //inflate view layout
        view =inflater.inflate(R.layout.your_fragment, container, false);

        // return view
        return view;
    }

und benutze das

 @Override
        public void setUserVisibleHint(boolean isUserVisible)
        {
            super.setUserVisibleHint(isUserVisible);
           // when fragment visible to user and view is not null then enter here.
                if (isUserVisible && view != null)
                {
                   onResume();
                }

        }

und In OnResume-Methode 

@Override
         public void onResume() { 
         super.onResume();   
            if (!getUserVisibleHint()) {
            return;
          }
      //do your stuff here
   }
4
Rahul

Sie müssen mViewPagerListener.onPageSelected(0); in onCreateView in Ihrer Stammaktivität/in Ihrem Fragment manuell aufrufen.

3
Yuraj

Ich verstehe nicht, was Sie genau benötigen, aber Sie können die Seite des aktuellen Fragments erkennen, indem Sie ViewPager.getCurrentItem aufrufen, die eine Ganzzahl zurückgibt.

Ich hoffe es hilft.

Viel Glück.

0
Emre Aktürk

Nun, die Problemumgehung ist mehr und vielleicht ist es besser OnPageChangeListener einzurichten, aber es funktioniert für mich. Die Aufgabe besteht darin, festzustellen, ob das aktuelle Fragment bei der Erstellung sichtbar ist. Sie können das Menü dazu verwenden. In deinem Fragment:

 @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true); // set current fragment has its own options menu
    } 

und das

 @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
     ...

            if(isMenuVisible()) { // menu should be visible if current fragment is visible right now
                setUserVisibleHint(true); // manually set value to true
            }
     ...
    return view;

Vielleicht wird es jemand nützlich finden. Das funktioniert für mich.

0
kara4k