I frammenti stanno diventando sovrapposti sul pulsante indietro
-
23-12-2019 - |
Domanda
Ho creato 3 frammenti in particolare (frammenta, frammentb, frammento) e una mainattività. C'è un pulsante in ogni frammento che si sostituisce con il prossimo frammento fino a frammentc.
Sto sostituendo frammenta (con) frammentb (quindi con) frammentc.
Transazione da frammenta a frammentb utilizza la seguente funzione
@Override
public void fragmentreplacewithbackstack(Fragment fragment, String tag) {
FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.contner,fragment , tag);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
// fragmentManager.executePendingTransactions();
}
.
Transazione da frammentb a frammentc utilizza la seguente funzione
public void fragmentreplace(Fragment fragment,String tag){
FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.contner,fragment , tag);
fragmentTransaction.commit();
}
.
Problema è quando premo il pulsante Indietro da frammentc, frammentc e frammenta si sovrappongono l'uno con l'altro.
Soluzione
È necessario aggiungere anche il frammento C a Backstack, se vuoi andare al frammento B sulla spalla da qui.
Quindi chiama anche il frammento c pure.
fragmentTransaction.addToBackStack(null);
.
Modifica - Modifica questo metodo corrente Usando per passare da B a C,
public void fragmentreplace(Fragment fragment,String tag){
FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.contner,fragment , tag);
fragmentTransaction.addToBackStack(null); //this will add it to back stack
fragmentTransaction.commit();
}
. Altri suggerimenti
Ho avuto lo stesso problema e questa risposta di BUDIIO mi ha aiutato molto.
Puoi risolvere il tuo problema nel modo seguente:
1) istanziare il seguente listener (è necessario conservare il riferimento dell'istanza del frammento) e, poiché frammenta è l'unico frammento aggiunto alla sponda, quando l'utente preme il pulsante Indietro, il numero di transazioni nel barbatiere saràzero
private OnBackStackChangedListener backStackChangedListener = new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if(getSupportFragmentManager().getBackStackEntryCount()==0) {
if(fragmentC!=null) {
getSupportFragmentManager().beginTransaction().remove(fragmentC).commit();
}
}
}
};
.
2) Aggiungi l'ascoltatore nella mainattività quando quest'ultimo è avviato
getSupportFragmentManager().addOnBackStackChangedListener(backStackChangedListener);
.
3) Rimuovere l'ascoltatore quando l'attività è interrotta
Perché non fai solo un'attività di frammento con un layout del telaio in cui è possibile sostituire quel telaio con qualsiasi frammento ..
Screen extends FragmentActivity
{
protected void onCreate(Bundle b)
{
super.onCreate(b);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.work);
callPerticularScreen(screenNumber,false,null,null);
}
public void callPerticularScreen(int screenNumber,boolean addToBackStack,String nameTag,Bundle b)
{
switch(screenNumber)
{
case registrationScreen:
callFragForMiddleScreen(registrationPageFrag,addToBackStack,nameTag);
break;
case dashboardScreen:
callFragForMiddleScreen(dashboardFrag,addToBackStack,nameTag);
break;
default:
break;
}
}
}
.
Ora da qualsiasi schermata del frammento è possibile chiamare questa funzione per sostituire il tuo frammento con un altro ..-
private void callFragForMiddleScreen(Fragment frag,boolean addToBackStack,String nameTag)
{
transFragMiddleScreen=getFragManager().beginTransaction();
transFragMiddleScreen.replace(getMiddleFragId(),frag);
if(addToBackStack)
{
transFragMiddleScreen.addToBackStack(nameTag);
}
transFragMiddleScreen.commit();
//getFragManager().executePendingTransactions();
}
.
Dalla tua framement basta chiamare
Frag1 extends Fragment
{
onActivityCreate()
{
middleScreen=(Screen) getActivity();
middleScreen.callPerticularScreen(1,true,"tag");
}
}
.
Layout per attività di frammento ..
<RelativeLayout
android:id="@+id/rl2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/rl" >
<FrameLayout
android:id="@+id/middle_screen"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</RelativeLayout>
.
Basta aggiungere il frammento B al back stack in modo da poter venire da c-> a direttamente.
25 Libreria di supporto
Ad esempio se hai
A -> B -> C
A id is 0
B id is 1
C id is 2
.
al rollback a un frammento basta chiamare
getFragmentManager().popBackStackImmediate(0 /* ID */, 0 /* flag */);
.
0 - ID della voce del backstack a rollback
o
popBackStackImmediate(1, FragmentManager.POP_BACK_STACK_INCLUSIVE)
.
frammentmanager.pop_back_stack_inclusive, significa che vuoi anche rimuovere l'ID in dotazione
Inoltre puoi chiamare
getFragmentManager().popBackStackImmediate("stack_name", 0)
.
"stack_name" È un nome di Backstack per ripristinare
Ad esempio
A -> B -> C -> D
A in MAIN_BACK_STACK
B in MAIN_BACK_STACK
C in SEPARATE_BACK_STACK
D in SEPARATE_BACK_STACK
.
Se vuoi tornare al frammento B Basta chiamare
getFragmentManager().popBackStackImmediate("MAIN_BACK_STACK", 0)
or
getFragmentManager().popBackStackImmediate("SEPARATE_BACK_STACK", FragmentManager.POP_BACK_STACK_INCLUSIVE)
.