Search code examples
javaandroidandroid-fragmentsonbackpressed

onBackPressed and backStack showing blank screen before exit


Earlier, I was having an issue with onBackPressed and got it resolved with some help here.

After doing some research, I found out that due to having my starting fragment in the backstack, it's producing an extra 'back' count so when I attempt to exit my app, I get a blank screen:

Home / Starting fragment After pressing back

Instead of the blank screen I should get a prompt for "Are you sure to exit" instead of the blank. From the blank screen, I do get my 'are you sure to exit' menu, but I'd prefer not seeing an extra blank screen.

I've also noticed that it seems to not update the fragment titles on the back pressed, but I'm assuming that's another issue all together.

I'm unsure how to separate my home fragment from the backStack count. If I'm to avoid it from being added to the stack, but leave it as a navigational item, I'm confused on how that would even work.

Code:

public class Home extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {
private Fragment fragment = null;
private FragmentManager fragmentManager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    DatabaseHelper myDbHelper = new DatabaseHelper(Home.this);


    try {
        myDbHelper.createDataBase();
    } catch (IOException ioe) {
        throw new Error("Unable to create database");
    }

    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.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
    navigationView.setItemIconTintList(null);
//        getHome();

    displayView(R.id.nav_large_monsters);

}

private boolean viewIsAtHome;

@Override
public void onBackPressed() {
    // Pressing back popped the back stack, nothing else to do
    FragmentManager fragmentManager = getSupportFragmentManager();
    if (!fragmentManager.isStateSaved() && fragmentManager.popBackStackImmediate()) {
        return;
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        }

    if (!viewIsAtHome) {
            displayView(R.id.nav_large_monsters);
        } else {
            new AlertDialog.Builder(this)
                    .setMessage("Are you sure you want to exit?")
                    .setCancelable(false)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            Home.this.finish();
                        }
                    })
                    .setNegativeButton("No", null)
                    .show();
     }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.search_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    return super.onOptionsItemSelected(item);
}


private void getHome(){
    fragment = new HomeFragment();
    if (fragment != null) {
        FragmentManager fragmentMgmt = getSupportFragmentManager();
        fragmentMgmt.beginTransaction().replace(R.id.content_frame, fragment).commit();
    }
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    displayView(item.getItemId());
    return true;

}

public void displayView(int viewId) {

//        Fragment fragment = null;
    String title = getString(R.string.app_name);

    switch (viewId) {
        default:
            fragment = new Large_Monsters();
            title  = "Large Monsters";
            break;

        case R.id.nav_large_monsters:
            fragment = new Large_Monsters();
            title  = "Large Monsters";
            viewIsAtHome = true;
            break;

        case R.id.nav_small_monsters:
            fragment = new Small_Monsters();
            title = "Small Monsters";
            viewIsAtHome = false;
            break;

        case R.id.nav_weapons:
            fragment = new Weapons();
            title = "Weapons";
            viewIsAtHome = false;
            break;

        case R.id.nav_armors:
            fragment = new Armors_Low_High();
            title = "Armor Sets";
            viewIsAtHome = false;
            break;

        case R.id.nav_charms:
            fragment = new Charms();
            title = "Charms";
            viewIsAtHome = false;
            break;

        case R.id.nav_items:
            fragment = new Items();
            title = "Items";
            viewIsAtHome = false;
            break;

        case R.id.palico_armor:
            fragment = new Palico_Armor();
            title = "Palico Armor";
            viewIsAtHome = false;
            break;

        case R.id.palico_gadgets:
            fragment = new Palico_Gadgets();
            title = "Palico Gadgets";
            viewIsAtHome = false;
            break;

        case R.id.palico_weps:
            fragment = new Palico_Weapons();
            title = "Palico Weapons";
            viewIsAtHome = false;
            break;

        case R.id.palico_helms:
            fragment = new Palico_Helms();
            title = "Palico Helmets";
            viewIsAtHome = false;
            break;

    }

    if (fragment != null) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.replace(R.id.content_frame, fragment, fragment.getTag());
                ft.addToBackStack(null);
                ft.commit();
    }

    // set the toolbar title
    if (getSupportActionBar() != null) {
        getSupportActionBar().setTitle(title);
    }

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

}

}

Solution

  • You just don't have to call addToBackStack(null) on your Home page(ex: Large_Monsters fragment)

    so just add in your onCreate method like this

    Large_Monsters fragment = new Large_Monsters();
    
    if (fragment != null) {
        FragmentManager fragmentMgmt = getSupportFragmentManager();
        fragmentMgmt.beginTransaction().replace(R.id.content_frame, fragment).commit();
    }
    

    In your left side menu, you just need to check whether this fragment exists or not, if not then replace it otherwise remove other fragments.