2016-09-06 8 views
1

In meinem MainActivity gibt es eine FrameLayout (id = fragment_container), die durch die Aktivität in onCreate mit FragmentA ersetzt wird. FragmentA enthält nur eine einzelne Schaltfläche und ruft onClick in MainActivity auf, um die FrameLayout durch FragmentB zu ersetzen. FragmentB enthält eine RecyclerView und wird korrekt angezeigt. Ich rufe fragmentManager.popBackStack() an, um FragmentA zurückzubringen. Jetzt wird FragmentA über FragmentB angezeigt (mit dem ich noch interagieren kann).Fragment immer noch sichtbar nach popBackStack

Warum wird FragmentB nicht nach dem Aufruf entfernt?

MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

    private FragmentManager fragmentManager; 

    @Override 
    public void onBackPressed() { 
     fragmentManager.popBackStack(); 
    } 

    @Override 
    public void onClick(View view) { 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.fragment_container, new FragmentB()); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //... 

     fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     FragmentA fragment = FragmentA.getInstance(this); //register OnClickListener 
     fragmentTransaction.replace(R.id.fragment_container, fragment); 
     fragmentTransaction.commit(); 
    } 
//... 
} 

fragmenta

public class FragmentA extends Fragment { 

    private View.OnClickListener onClickListener; 

    public FragmentA() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_a, container, false); 

     FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab); 
     fab.setOnClickListener(onClickListener); 

     return view; 
    } 

    public static FragmentA getInstance(View.OnClickListener onClickListener) { 
     FragmentA fragmentA = new FragmentA(); 
     fragmentA.setOnClickListener(onClickListener); 
     return fragmentA; 
    } 

    private void setOnClickListener(View.OnClickListener onClickListener) { 
     this.onClickListener = onClickListener; 
    } 
} 

FragmentB

public class FragmentB extends Fragment { 

    //... 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.FragmentB, container, true); 
     //manipulating Views... 
     //... 

     return view; 
    } 
} 
+0

Fügen Sie dem Fragment A eine Hintergrundfarbe hinzu. – JpCrow

+0

@JpCrow wäre das nicht ein dreckiger Workaround? –

+0

Wenn Sie es vorziehen, können Sie es in das Thema Ihrer Aktivität hinzufügen, dann überprüfen Sie mit den Entwicklern Tools die Überziehung des Fragments – JpCrow

Antwort

0

Das Problem ist in der FragmentB Klasse. Sie sollten das Argument attachToRoot=true nicht übergeben.

Versuchen Sie stattdessen:

public class FragmentB extends Fragment { 

    //... 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     //don't pass true 
     View view = inflater.inflate(R.layout.FragmentB, container, false); 
     //manipulating Views... 
     //... 

     return view; 
    } 
} 
0

Verwenden popBackStackImmediate stattdessen

@Override 
public void onBackPressed() { 
    fragmentManager.popBackStackImmediate(); 
} 

Vom popBackStackImmediate docs,

Wie popBackStack(), aber die Operation unmittelbar innerhalb des Anrufs . Dies ist wie der Aufruf von executePendingTransactions() danach.

+0

bereits versucht, dass, änderte nichts. –

Verwandte Themen