2014-05-22 13 views
5

Wir alle wissen, dass, wenn ViewPager mit Fragment und FragmentPagerAdapter benutzen wir 3 Fragment erhalten geladen: die sichtbare und beide auf jeder ihrer Seiten.Wie wenn ein Fragment bereits genannt onCreateView()

Also, wenn ich habe 7 Fragments und ich bin durch sie durchlaufen, um zu sehen, welche 3 von denen sind, die geladen werden, und damit meine ich onCreateView() wurde schon aufgerufen, wie kann ich das feststellen?

EDIT: Die Fragment nicht derjenige sein, die die ViewPager zeigt, nur dass onCreateView() wurde bereits aufgerufen.

Antwort

8

logisch Nun, dies wäre ein angemessener Test sein, wenn onCreateView aufgerufen wurde: Sie

myFragment.getView() != null; 

Unter der Annahme einer einen Verweis auf alle Fragmente in dem Pager Iterierte haben, sie und überprüfen, ob sie einen Blick haben .

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

aktualisieren

Die obige Antwort geht davon aus, dass Ihre Fragmente immer eine Ansicht erstellen, und sind nicht viewless Fragmente. Wenn sie dann schlage ich vor Unter das Fragment Klassierung wie so:

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; 
    } 
} 

tragen Sie nur daran, dass weitere Unterklassen Super verlangen oder die Flagge gesetzt selbst sollten sie auch außer Kraft setzen onCreateView.

+1

Dies ist nicht deterministisch, weil 'onCreateView' null zurückkehren kann. – interlude

+0

@interlude - Wahre Geschichte. Fragmente müssen keine Aussicht haben. – dell116

-3

Sie können auch nach Fragment.isVisible() suchen, da sich ein Fragment im sichtbaren Status befindet, wenn es sich im Offscreen-Seitenlimit eines ViewPagers befindet.

Edit: Aber es hängt nur wirklich davon ab, was Sie wirklich mit Ihrer Frage erreichen wollen. Vielleicht eine Art Update für alle Benutzeroberflächen in Ihren Fragmenten, wenn ihre Benutzeroberfläche bereit ist?

EDIT:

Just another hinaus könnten Sie onViewCreated() hören, und ein Flag gesetzt. Oder benachrichtigen Sie Ihre Aktivität und machen Sie weitere Arbeit (getActivity() wird Ihre Aktivität an dieser Stelle zurückgeben). Aber geben Sie besser an, was Sie mit Ihrer Frage erreichen möchten.

+0

Wenn die Ansicht des Fragments ausgeblendet ist, gibt diese Methode false zurück. – interlude

+0

Ja, du hast recht, das ist eine beschissene Art, es zu tun. ^^ Es wäre einfacher, die Frage zu beantworten, wenn der Frager erklären würde, warum er die Informationen über 'onCreateView() 'benötigt.Er könnte natürlich 'onViewCreated()' hören und eine Flagge setzen, aber ich weiß nicht, ob dies seine Bedürfnisse befriedigt. – einschnaehkeee

3

Ich habe eine Schnittstelle zu Fragment hinzugefügt. Sieht aus wie:

protected OnCreateViewCallback createViewCallback = null; 

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

public interface OnCreateViewCallback { 

    void onCreateView(); 

} 

In meinem onCreateView():

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

Aus meiner Tätigkeit:

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