handle back button in single fragment

2019-05-01 16:22发布

I have an application with navigation drawer. when i start the application, what i have on main screen (screen A) is "hello world" and then when i select an item from navigation drawer, i load a fragment and get "new hello world" and then again when i select an item from navigation drawer, i load a fragment and get "hello universe". But since this is all happening via 1 single fragment, when i press the device back button i should get previous fragment like below:

"hello universe" >press back> "new hello world" >press back> "hello world"

how do i handle this ?

NOTE:

while changing the fragment i have tried

fragmentManager.beginTransaction().replace(R.id.mainContent, fragment).commit();

then i changed to :

fragmentManager.beginTransaction().add(R.id.mainContent, fragment).addToBackStack("tag").commit();

but nothing worked. The app exits on back button press. Is it due to the same fragment getting replaced by another content again and again?

3条回答
劫难
2楼-- · 2019-05-01 16:47

I think you need to add the fragment to the backstack by calling addToBackStack, something like this:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (fragmentManager.findFragmentByTag("MainFragment") == null) {
    fragmentTransaction.add(R.id.content_frame, fragment, "MainFragment");
} else {
    fragmentTransaction.replace(R.id.content_frame, fragment, "MainFragment");
    fragmentTransaction.addToBackStack("Fragment" + position);
}
fragmentTransaction.commit();

and the override OnBackPressed():

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ){
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}
查看更多
Anthone
3楼-- · 2019-05-01 16:50

use methods addToBackStack and popBackStack in order to handle back button for fragments here is sample

    ft.replace(R.id.simple_fragment, newFragment);
    ft.addToBackStack("tag");
    ft.commit();

and on back button

FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
    fm.popBackStack();
}
查看更多
别忘想泡老子
4楼-- · 2019-05-01 16:59

The second approach you tried is correct.Try to call popBackStack() on BackPressed() by overriding onBackPressed() method.

 @Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStack();
    } else if (getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    }
}
查看更多
登录 后发表回答