Back Navigation FragmentManager

  • Antworten:2
  • Bentwortet
[res][per]
  • Forum-Beiträge: 22

01.12.2015, 18:59:28 via Website

Hallo,

bei meinen letzten Projekten habe ich immer großzügig neue Activitys erstellt und nutze jetzt zum ersten Mal die Möglichkeit von Fragments.

Jetzt ist aber das Problem an sich, dass die Back Navigation über die Hardware Taste, egal wo ich in der App bin, diese schließt.

Ich habe jetzt versucht in der Main Activity onBackPressed so zu modifizieren, dass er erkennt welches Fragment gerade geladen ist und dann das entsprechende Parent Fragment lädt. Was zwar funktioniert, aber er lädt das Fragment, was ich noch sehe, beendet dann aber trotzdem die App.

Des weiteren weiß ich nicht ob mein Fragmant Managment allgemein nicht zu kompliziert ist und ob evtl einfacherer oder elegantere Lösungen gibt.

Meine Activity sieht zur Zeit so aus:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{

public FragmentManager fragmentManager;
public FragmentTransaction fragmentTransaction;
public MainActivityFragment fragmentMain;
public MediAbcFragment fragmentMedisAbc;

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    fragmentManager = getSupportFragmentManager();
    fragmentTransaction  = fragmentManager.beginTransaction();
    fragmentMain = new MainActivityFragment();
    fragmentTransaction.replace(R.id.fragment, fragmentMain, "FragmentMain");
    fragmentTransaction.commit();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();
    switch (id){
        case R.id.nav_start:
            fragmentManager = getSupportFragmentManager();
            fragmentTransaction  = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.fragment, fragmentMain, "FragmentMain");
            fragmentTransaction.commit();
            break;
        case R.id.nav_medis:
            fragmentManager = getSupportFragmentManager();
            fragmentTransaction  = fragmentManager.beginTransaction();
            fragmentMedisAbc = new MediAbcFragment();
            fragmentTransaction.replace(R.id.fragment, fragmentMedisAbc, "FragmentMedisAbc");
            fragmentTransaction.commit();
            break;
        default:
            break;
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
    if(fragmentMedisAbc != null && fragmentMedisAbc.isVisible()){
        fragmentManager = getSupportFragmentManager();
        fragmentTransaction  = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragment, fragmentMain, "FragmentMain");
        fragmentTransaction.commit();
    }

}

}

Gruß

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.12.2015, 20:24:33 via App

beim austauschen des Fragments musst du dafür FragmentTransaction#addToBackStack(null);
Dann musst du überhaupt keine onBackPressedEvents abfangen etc.

bsp: http://stackoverflow.com/questions/14354885/android-fragments-backstack

LG Pascal //It's not a bug, it's a feature. :) ;)

Ludy[res][per]

Antworten
[res][per]
  • Forum-Beiträge: 22

01.12.2015, 21:28:22 via Website

Vielen Dank für den Tipp, habe jetzt auch mein Fragment Management zentralisiert ;-)

    public void setFragmentManager(Fragment fragment){
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction  = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.fragment, fragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

Antworten