2016-10-04 4 views
0

Ich habe eine Hostaktivität und zwei Fragmente. Ich habe OnBackStackChangeListener für die Aktivität implementiert, so dass die Zurück-Schaltfläche auf der Aktionsleiste konsistentes Verhalten bietet. Ich verstehe, dass bei einer Änderung der Bildschirmausrichtung eine Aktivität zerstört und neu erstellt wird, aber gibt es eine Möglichkeit, zu verhindern, dass doppelte Fragmente als Ergebnis von Änderungen an der Installation in den Backstack eingefügt werden, ohne onConfigurationChanged zu überschreiben? Denn jetzt blättert der Zurück-Button durch doppelte Fragmente.So verhindern Sie, dass doppelte Fragmente zum Backstack hinzugefügt werden, wenn sich die Bildschirmausrichtung ändert

MyActivity:

public class DepartmentListActivity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    overridePendingTransition(0, 0); 
    setContentView(R.layout.activity_department_list); 
    getSupportFragmentManager().addOnBackStackChangedListener(this); 

    DepartmentListFragment fragment = DepartmentListFragment.newInstance(); 

    getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.department_list_container, fragment) 
      .addToBackStack("list") 
      .commit(); 

    shouldDisplayHomeUp(); 

} 

@Override 
public void onBackStackChanged() { 
    shouldDisplayHomeUp(); 
} 

public void shouldDisplayHomeUp(){ 
    //Enable Up button only if there are entries in the back stack 
    boolean canback = getSupportFragmentManager().getBackStackEntryCount()>0; 
    getSupportActionBar().setDisplayHomeAsUpEnabled(canback); 
} 

@Override 
public boolean onSupportNavigateUp() { 
    //This method is called when the up button is pressed. Just the pop back stack. 

    if(getSupportFragmentManager().getBackStackEntryCount()>1){ 
     getSupportFragmentManager().popBackStack(); 
    }else{ 
     startActivity(new Intent(this, MainMenuActivity.class)); 
    } 
    return true; 
} 
} 

FromListAdapter:

Fragment fragment = DepartmentOverviewFragment.newInstance(); 

      ((DepartmentListActivity) context). 
        getSupportFragmentManager(). 
        beginTransaction(). 
        replace(R.id.department_list_container, fragment).addToBackStack("overview").commit(); 

Antwort

3

Versuchen Hinzufügen das Fragment nur dann, wenn die savedInstanceState null ist.

+0

Im Wechsel von Fragmenten von einem BaseAdapter, so kann ich den savedInstanceState nicht überprüfen – BiGGZ

0
if (null == getSupportFragmentManager().findFragmentByTag("someTag")) { 
getSupportFragmentManager() 
    .beginTransaction() 
    .replace(R.id.department_list_container, fragment, "someTag") 
    .addToBackStack("list") 
    .commit(); 
} 
Verwandte Themen