2013-05-20 11 views
26

Ich benutze die Support-Bibliothek v4 und meine Fragen lauten: Wie kann ich feststellen, ob ein Fragment sichtbar ist? und Wie kann ich die Eigenschaften des im Fragment aufgeblähten Layouts ändern? Danke im Voraus.Wie kann man erkennen, ob ein Fragment sichtbar ist?

--- --- Bearbeiten

Ich verwende Fragmente wie in den Android-Entwickler Tutorial mit einem FragmentActivity

+0

http://developer.android.com/reference/android/app/Fragment.html#isVisible() – Tarun

+1

Die Lösung, die am besten für mich funktionierte, war http://stackoverflow.com/a/6751537/1816603 –

Antwort

49

Sie sollten Folgendes tun können, :

MyFragmentClass test = (MyFragmentClass) getSupportFragmentManager().findFragmentByTag("testID"); 
if (test != null && test.isVisible()) { 
    //DO STUFF 
} 
else { 
    //Whatever 
} 
+6

Eigentlich wird es 'test! = Null && test.isVisible()' sonst, wenn der Test null ist, wird es 'NullPointerException' werfen – Axxiss

+0

@Axxiss Danke, ich habe das vergessen, ich hatte diese als zwei verschiedene Wenn's in meinem Code aber habe es hier einfach geändert. Kommen Sie, um darüber nachzudenken ... Ich sollte wahrscheinlich das in meinem Code ändern ... – TronicZomB

+1

Danke. Es ist das gleiche wie oben und es funktioniert. –

1
ArticleFragment articleFrag = (ArticleFragment) 
      getSupportFragmentManager().findFragmentById(R.id.article_fragment); 

    if (articleFrag != null && articleFrag.isVisible()) { 

     // Call a method in the ArticleFragment to update its content 
     articleFrag.updateArticleView(position); 
    } 

siehe http://developer.android.com/training/basics/fragments/communicating.html

+0

Danke . Das funktioniert für mich. –

6

Sie können setMenuVisibility folgendermaßen überschreiben:

@Override 
public void setMenuVisibility(final boolean visible) { 
    if (visible) { 
     //Do your stuff here 
    } 

    super.setMenuVisibility(visible); 
} 
+0

Vielen Dank, es ist seltsam, dass eine Funktion mit diesem Namen solche Funktionalität geben kann, ich habe viel über dieses Problem gesucht, vielen Dank. – EyadMhanna

+0

Tolle Funktion/Trick! Vielen Dank! Spart viel Zeit. – cdkn7

3

Eine Sache bewusst zu sein, ist, dass isVisible() den sichtbaren Zustand des aktuellen Fragment zurückgibt. Es gibt ein Problem in der Unterstützungsbibliothek. Wenn Sie verschachtelte Fragmente haben und das Elternfragment (und damit alle untergeordneten Elemente) ausblenden, sagt das Kind immer noch, dass es sichtbar ist.

isVisible() ist endgültig, so kann leider nicht überschrieben werden. Meine Abhilfe war ein BaseFragment Klasse zu erstellen, die alle meine Fragmente erweitern, und erstellen Sie dann eine Methode, wie so:

public boolean getIsVisible() 
{ 
    if (getParentFragment() != null && getParentFragment() instanceof BaseFragment) 
    { 
     return isVisible() && ((BaseFragment) getParentFragment()).getIsVisible(); 
    } 
    else 
    { 
     return isVisible(); 
    } 
} 

ich isVisible() && ((BaseFragment) getParentFragment()).getIsVisible();, weil wir falsch zurückkehren wollen, wenn jede der Eltern Fragmente versteckt sind.

Dies scheint den Trick für mich zu tun.

+0

Vielen Dank! Verschwendete 2 Stunden, kratzte meinen Kopf darüber. – fhucho

+0

Was ist, wenn das übergeordnete Fragment sichtbar ist, aber das verschachtelte Fragment, für das geprüft wird, nicht sichtbar ist? .. Wie überprüfen wir ein solches Szenario? – leoOrion

9

getUserVisibleHint() kommt nur als wahr, wenn das Fragment in der Ansicht ist und sichtbar

+0

In meinem Fall gibt jedes Fragment 'getUserVisibleHint()' ist wahr –

8

Sie auf diese Weise versuchen:

Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragment_container); 

oder

Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); 

In dieser wenn, überprüfen Sie, ob currentFragment ist eine Instanz von YourFragment

if (currentFragment instanceof YourFragment) { 
    Log.v(TAG, "your Fragment is Visible"); 
} 
3

Sowohl isVisible() als auch isAdded() geben true zurück, sobald die Fragment erstellt und nicht einmal tatsächlich sichtbar ist. Die einzige Lösung, die tatsächlich funktioniert, ist:

if (isAdded() && isVisible() && getUserVisibleHint()) { 
    ... do your thing 
} 

Das macht den Job. Zeitraum.

+0

Ich verbringe viel Zeit nur für diese getUserVisibleHint() THX – Ares91

6

Wenn Sie wissen möchten, bei Verwendung im Fragment suchen, sollten Sie

yourFragment.isResumed() 

statt

yourFragment.isVisible() 

Vor allem isVisible() verwenden bereits überprüft für isAdded() so keine Notwendigkeit, sowohl für den Aufruf. Zweitens bedeutet "Nicht von diesen beiden", dass der Benutzer tatsächlich Ihr Fragment sieht. Nur isResumed() stellt sicher, dass sich Ihr Fragment vor dem Benutzer befindet und Benutzer mit ihm interagieren können, wenn das was Sie suchen.

+1

Schöne Antwort und Erklärung, +1 eine Million Mal, wenn ich könnte –

+1

Dies funktioniert nicht. Es gibt mir für alle Tabs evn wahr, obwohl nur einer von ihnen in Verwendung und sichtbar ist. – leoOrion

+0

Es scheint nicht zu funktionieren. isResumed gibt immer noch 'true' zurück, selbst das Fragment ist im Backstack und überhaupt nicht sichtbar. Ich habe 'isResumed' auf 'onPrepareOptionsMenu' überprüft und verwende getChildFragmentManager für untergeordnete Fragmente im View Pager. – wonsuc

Verwandte Themen