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.

come sotto schermo

È stato utile?

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)
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top