2016-04-20 6 views
0

Einer der Bildschirme in einer App, die ich gerade entwickle, enthält mehrere Unterbildschirme, die als Fragmente implementiert sind und von einer unteren Navigationsleiste gesteuert werden.Verstecktes Fragment, das noch Benutzereingaben empfängt

Das ist mein Code für ist, wenn der Benutzer wünscht, Fragmente wechseln:

protected final void switchTab(int index) { 
    if (curTabIndex == index) { 
     return; 
    } 

    if (bottomNavigationBar.getCurrentTabPosition() != index) { 
     bottomNavigationBar.selectTabAtPosition(index, true); 
    } 

    curTabIndex = index; 
    FragmentTransaction ft = fragmentManager.beginTransaction(); 

    ft.setCustomAnimations(R.anim.alpha_in, R.anim.alpha_out); 

    detachCurrentFragment(ft); 

    // Attempt to reattach previous fragment. 
    BottomTabbedActivityFragment fragment = reattachExistingFragment(ft); 

    if (fragment != null) { 
     ft.commit(); 
    } else { 
     fragment = fragments.get(curTabIndex); 
     ft.add(contentContainer.getId(), fragment, (fragment.getClass().getName())); 
     ft.commit(); 
    } 

    fragmentManager.executePendingTransactions(); 

    curFragment = fragment; 
} 

/** 
* Attemps to detach any current fragment if it exists, and if none is found, returns; 
* 
* @param ft the current transaction being performed 
*/ 
private void detachCurrentFragment(FragmentTransaction ft) { 
    // Attempt to detach current fragment. 
    if (curFragment != null) { 
     ft.hide(curFragment); 
    } 
} 

/** 
* Will attempt to reattach a previous fragment in the FragmentManager, or return null if not able to, 
* 
* @param ft current fragment transaction 
* @return Fragment if we were able to find and reattach it 
*/ 
@Nullable 
private BottomTabbedActivityFragment reattachExistingFragment(FragmentTransaction ft) { 
    Fragment fragment = fragmentManager.findFragmentByTag(fragments.get(curTabIndex).getTag()); 

    if (fragment != null) { 
     ft.show(fragment); 
    } 

    return (BottomTabbedActivityFragment) fragment; 
} 

das Snippet oben verwenden, ich bin in der Lage problemlos zwischen den Fragmenten zu wechseln. Es gibt jedoch ein großes Problem mit diesem Ansatz: Das hinzugefügte las-Fragment behält die Benutzereingaben, obwohl es versteckt ist.

Mit anderen Worten sagen, mein Benutzer ging diese Änderung Sequenz Trog:

Subscreen A ->Subscreen B ->Subscreen C ->Subscreen A

Logisch, wird der Eingang nun Subscreen A behandelt werden, seit Subscreen C ist jetzt ausgeblendet. Aber die Realität spricht anders: Subscreen C ist immer noch derjenige, der Benutzereingaben erhält.

Ich kann sogar einige Fehler sehen, die Subscreen C beim Versuch, in Subsreen A scrollen zu sehen.

Kann ich das irgendwie beheben?


P. S., diese Subscreens, die ich gerade habe, sind sehr teuer, um neu zu initialisieren. Sie alle haben eine komplexe Sichthierarchie, und es wird erwartet, dass der Benutzer viel zwischen ihnen wechselt. Ich versuchte attach()/detach(), aber es wurde so langsam in meinen Tests.

+0

Wenn du dein aktuelles Fragment nicht entfernst/ersetzst, sind sie immer noch aktiv, wenn du Listener für Events verwendest, solltest du sie wahrscheinlich abbrechen (auf null oder sonst), solange es nicht sichtbar ist. –

+0

Es macht mir nichts aus sie sind aktiv, obwohl sie nicht sichtbar sind. Ich brauche sie nur (nicht sichtbare Fragmente), um keine eingehenden Benutzereingaben zu verarbeiten. Was ich sage ist, dass ich möchte, dass sie mit etwas wie "View.setVisibility (GONE)" statt nur mit "View.setVisibility (INVISIBLE)" versteckt werden. – ridsatrio

+0

alt aber vielleicht hilfreich, Sie brauchen nur einen Weg, um das ClickEvent von bubbeling zu verhindern http://StackOverflow.com/Questions/10389620/Fragment-Over-Another-Fragment-issue –

Antwort

0

Setzen Sie einfach android:clickable="true" in die Stammansicht in der Layoutdatei des Fragments.

+0

Versuchte Ihre Lösung, kein Glück. – ridsatrio

+0

Fügen Sie diese Zeile in alle drei Layouts von A, B und C ein. – sonngaytho

+0

Ich habe es auf alle von ihnen ... – ridsatrio

Verwandte Themen