Kind Fragment setUserVisibleHint und onResume nicht genannt

Ich versuche, eine Funktion aufzurufen, wenn der Benutzer wechseln Sie die Seite, um mein Kind-fragment. Aber, wenn ich versuche, mit setUserVisibleHint und onResume, die beiden Funktionen aufgerufen werden, von meinen Eltern fragment.

Kind Fragment setUserVisibleHint und onResume nicht genannt

Zuerst habe ich eine Ansicht pager in Activity

Dann in A1, A3 und B1, ich habe setUserVisibleHint und onResume Funktionen.

setUserVisibleHint und onResume Funktionen

@Override
public void setUserVisibleHint(boolean visible) {
    super.setUserVisibleHint(visible);
    Log.d("A1", "setUserVisibleHint"); //A3 for Fragment A3 and B1 for Fragment B1 
    if (visible && isResumed())
        onResume();
}
@Override
public void onResume() {
    super.onResume();
    Log.d("A1", "onResume"); //A3 for Fragment A3 and B1 for Fragment B1 
    if (!getUserVisibleHint())
        return;
}

Fragen:

Wenn ich auf Seite B von Seite A und die Aussicht ist Fragment B1, bekomme ich (Das ist OK)

D/A1: setUserVisibleHint
D/B1: setUserVisibleHint
D/B1: onResume

Wenn ich auf Seite A von Seite B und die Aussicht ist Fragment A1, bekomme ich (Das ist OK)

D/B1: setUserVisibleHint
D/A1: setUserVisibleHint
D/A1: onResume

Wenn ich auf Seite A von Seite B und die Aussicht ist Fragment A3, bekomme ich (PROBLEM)

D/B1: setUserVisibleHint
D/A1: setUserVisibleHint
D/A1: onResume

Ich gehe davon aus, dass der Ausdruck sollte wie folgt Aussehen, aber ich bin nicht sicher, warum die Funktionen genannt, die von übergeordneten fragment.

D/B1: setUserVisibleHint
D/A3: setUserVisibleHint
D/A3: onResume

Referenz

Fragment A1 -> A2,

A2 a2 = new A2();
getFragmentManager().beginTransaction().add(R.id.A1_frameChildFragment, a2)
    .addToBackStack(null)
    .commit();

Fragment A2 -> A3,

A3 a3 = new A3();
getFragmentManager().beginTransaction().add(R.id.A2_frameChildFragment, a3)
    .addToBackStack(null)
    .commit();
  • Bitte teilen Sie den code, wo werden Sie das hinzufügen das fragment A2 und A3. Sind Sie mit dem hinzufügen fragment A2 und A3 im Fragment A1??
  • Rufen Sie nicht lifecycle-Methoden (wie onResume) selbst. Sie sind gesteuert von Android, nicht stören, oder du wirst etwas zu brechen.
InformationsquelleAutor Pak Ho Cheung | 2018-01-08



4 Replies
  1. 5

    onResume wird nicht genannt beim wechseln zwischen Reiter in ViewPager.

    setUserVisibleHint wird genannt in der übergeordneten fragment jedes tab beim wechseln zwischen in ViewPager und wird nicht genannt in Kind-fragment.

    Dies ist die Standard-Verhalten, also ich denke, wir können es nicht ändern.

    Allerdings gibt es eine workaround-Lösung. Es ist das senden der sichtbaren Hinweis von Eltern-fragment auf das Kind-fragment

    //visible hint in parent fragment
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (!isAdded()) {
            return;
        }
        Fragment fragment = getChildFragmentManager().findFragmentById(R.id.A1_frameChildFragment); //find current child fragment
        if (fragment != null) {
            fragment.setUserVisibleHint(isVisibleToUser); //send visible from parent to this child fragment
        }
    }
    • Funktioniert wie ein Charme. !! Vielen Dank für das teilen 😉
    • Es stürzt das Kind-Fragment ist nicht angebracht noch
  2. 3

    setOnPageChangeListener Methode ist als deprecated gekennzeichnet, verwenden addOnPageChangeListener statt

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

    Dafür haben Sie Ihren Anruf-fragment, wenn Sie laden /wenn Sie klicken Sie auf den Reiter/tab-Ansicht.

    Wie in Ihrem Fall werden alle Fragmente laden zur gleichen Zeit also, wenn Sie ändern die fragment es keine Veranstaltung in der Klasse.

    Für meine Anwendung, ich habe das gleiche Problem, also ich lade das fragment, wenn ich auf den tab dann nach dem fragment genannt und bietet mit dem event.

  4. 0

    Ersten immer starten oder erstellen Sie ein fragment aus Activity. Da Fragment ist im Grunde eine Instanz oder ein Teil Ihrer Tätigkeit. Das ist, warum, immer starten oder erstellen Sie das fragment aus Activity Kontext statt Fragment für eine bessere Kontrolle über fragment-Lebenszyklus.

    Zum Beispiel zum starten FragmentA aus FragmentB erstellen Sie eine Methode in Ihrer Activity als,

    public void startFragmentB(){
       FragmentManager manager = getSupportFragmentManager();
       FragmentB fragment = new FragmentB();
       FragmentTransaction transaction = manager.beginTransaction();
       transaction.replace(R.id.container, fragment).addToBackStack("tag");
       transaction.commit();
    }

    Nun, wo Sie starten möchten oder erstellen Sie FragmentB in Ihrem FragmentA einfach anrufen oben beschriebenen Methode aus Ihrer Tätigkeit als,

    ((YourActivity) getActivity()).startFragmentB();
    • Dies ist nicht eine gute Lösung für die Kind-Fragmente. Man oft will, um Anrufe empfangen zu onAttachFragment(Fragment) im Eltern-fragment, wenn das Kind angebracht ist, um die Aktivität. Mit diesem Vorschlag, dass call-back wird nicht passieren. Besser zu installieren Sie, das Kind-fragment durch die Verwendung getChildFragmentManager() direkt in der übergeordneten fragment, nicht die Aktivität.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.