2014-05-22 10 views
5

Wszyscy wiemy, że podczas korzystania z ViewPager z Fragment i FragmentPagerAdapter mamy załadowane 3 Fragment: widoczne i oba po obu stronach.Jak sprawdzić, czy fragment już jest wywoływany naCreateView()

Tak więc, jeśli mam 7 Fragments i robię iterację przez nich, aby zobaczyć, które 3 z nich są załadowane, a przez to mam na myśli onCreateView() został już wywołany, jak mogę to ustalić?

EDIT:Fragment nie musi być tym, że ViewPager jest wyświetlane, tylko że onCreateView() została już wywołana.

Odpowiedz

8

Więc logicznie, byłoby to uzasadnione badanie jeśli onCreateView zostało nazwane:

myFragment.getView() != null; 

Zakładając Państwo mają odniesienie do wszystkich fragmentów w iteracyjne pagera, je i sprawdzić, czy mają widok .

http://developer.android.com/reference/android/app/Fragment.html#getView()

Aktualizacja

Powyższa odpowiedź zakłada, że ​​fragmenty zawsze utworzyć widok, a nie są viewless fragmenty. Jeśli są to proponuję sub classing fragment tak:

public abstract class SubFragment extends Fragment 
{ 
    protected boolean onCreateViewCalled = false; 

    public boolean hasOnCreateViewBeenCalled() 
    { 
     return onCreateViewCalled; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup Container, Bundle state){ 
     onCreateViewCalled = true; 
     return null; 
    } 
} 

Wystarczy pamiętać, że dodatkowe zajęcia sub będzie musiał zadzwonić Super lub ustawić flagę sami powinni zastąpić onCreateView również.

+1

To nie jest deterministyczny, ponieważ 'onCreateView' może zwróci null. – interlude

+0

@interlude - Prawdziwa historia. Fragmenty nie muszą mieć widoku. – dell116

-3

Można również sprawdzić, czy jest Fragment.isVisible(), ponieważ Fragment jest w widocznym stanie, gdy znajduje się w limicie strony poza ekranem ViewPager.

Edycja: Ale to naprawdę zależy od tego, co naprawdę chcesz osiągnąć za pomocą pytania. Być może jakieś uaktualnienie wszystkich UI w Fragmentach, gdy ich interfejs jest gotowy?

EDIT:

Kolejny dodatek, można słuchać onViewCreated() i ustawić flagę. Lub powiadom swoją aktywność i wykonaj dalsze prace (getActivity() zwróci twoją aktywność w tym momencie). Ale naprawdę, lepiej powiedz, co chcesz osiągnąć za pomocą swojego pytania.

+0

Jeśli widok fragmentu jest ukryty, ta metoda zwróci wartość false. – interlude

+0

Tak, masz rację, to jest gówniany sposób robienia tego. ^^ Byłoby łatwiej odpowiedzieć na pytanie, czy pytający określi, dlaczego potrzebuje informacji o 'onCreateView()'.Mógł oczywiście słuchać 'onViewCreated()' i ustawić flagę, ale nie wiem czy to spełnia jego potrzeby. – einschnaehkeee

3

Dodałem interfejs do Fragmentu. Wygląda następująco:

protected OnCreateViewCallback createViewCallback = null; 

public void setCreateViewCallback(OnCreateViewCallback createViewCallback) { 
    this.createViewCallback = createViewCallback; 
} 

public interface OnCreateViewCallback { 

    void onCreateView(); 

} 

W moim onCreateView():

//initialize your view. 
    if (createViewCallback != null) { 
     createViewCallback.onCreateView(); 
     createViewCallback = null; 
    } 
    return mainView; 

Od mojej działalności:

 if (ocrFragment.getView() == null) { 
      ocrFragment.setCreateViewCallback(new MainScreenFragment.OnCreateViewCallback() { 
       @Override 
       public void onCreateView() { 
        ocrFragment.ocrImage(picture, false); 
       } 
      }); 
     } else { 
      ocrFragment.ocrImage(picture, false); 
     } 
Powiązane problemy