Dude
Dude

Reputation: 173

Back Press on fragments

I am using sliding menu in my app and starts fragments from MainActivity i want to close application when back button is pressed. what it is doing that it opens the activity when back button is pressed in last fragment but i want to exit the app when back button is pressed in last fragment. how can i do this.

this is my on create

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

    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);
    getActionBar().setBackgroundDrawable(
            new ColorDrawable(Color.parseColor("#0057b3")));

    setContentView(R.layout.activity_main);
    graphicUtil = new GraphicsUtil();

    mTitle = mDrawerTitle = getTitle();
    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
    navMenuIcons = getResources()
            .obtainTypedArray(R.array.nav_drawer_icons);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

    navDrawerItems = new ArrayList<NavDrawerItem>();
    // My Feeds
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons
            .getResourceId(0, -1)));
    // Private Feeds
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons
            .getResourceId(1, -1)));
    // My Profile
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons
            .getResourceId(2, -1)));
    // People and Groups
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons
            .getResourceId(3, -1)));
    // Messages
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons
            .getResourceId(4, -1)));
    // Favorites
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons
            .getResourceId(5, -1)));
    // Credits
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons
            .getResourceId(6, -1)));
    // Settings
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[7], navMenuIcons
            .getResourceId(7, -1)));
    // About this app
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[8], navMenuIcons
            .getResourceId(8, -1)));
    // Contact us
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[9], navMenuIcons
            .getResourceId(9, -1)));
    // Log Out
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[10], navMenuIcons
            .getResourceId(10, -1)));

    navMenuIcons.recycle();

    mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

    adapter = new NavDrawerListAdapter(getApplicationContext(),
            navDrawerItems);
    mDrawerList.setAdapter(adapter);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, R.string.app_name, R.string.app_name) {
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(mDrawerTitle);
            invalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);


    // open default fragment

    if (savedInstanceState == null) {
        displayView(0);
    }
}

this my display view method that opens the fragments

private void displayView(int position) {
    switch (position) {
    case 0:
        // fragment = new MyPublicPostsFragment();
        fragment = new MyFeedsFragment();
        break;
    case 1:
        fragment = new MyPrivatePostsFragment();
        break;
    case 2:
        fragment = new MyProfileFragment();
        break;
    case 3:
        fragment = new PeopleFragment();
        break;
    case 4:
        fragment = new MessagesFragment();
        break;
    case 5:
        fragment = new FavouritesFragment();
        break;
    case 6:
        fragment = new CreditsFragment();
        break;
    case 7:
        fragment = new SettingsFragment();
        break;
    case 8:
        fragment = new AboutThisAppFragment();
        break;
    case 9:
        fragment = new ContactUsFragment();
        break;
    case 10:
        fragment = new LogOutFragment();
        store.setLoginStatus(null);
        break;
    default:
        break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment)
                .addToBackStack(null).commit();

        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);

    } else {
        Log.e("Main Activity", "error in creating fragment");
    }}

any help would be greatly appreciated

Thanx in advance

Upvotes: 0

Views: 829

Answers (3)

Aldo Borrero
Aldo Borrero

Reputation: 547

There are several ways of doing this (some betters than others):

  • Way 1: Perform a fragment transaction with a TAG string. That way in onBackPressed() on the MainActivity you can check with findFragmentByTag what the current fragment is, if is the fragment you want to exit, then exit, if not do nothing.

  • Way 2: As your displayView method is using a switch you can store the integer position in your MainActivity, that way in onBackPressed() you can check what integer is, and therefore you can know what fragment is.

  • Way 3: You can also create a variable called mCurrentFragment to store the current fragment, in onBackPressed() you can check with instanceOf what fragment is, and apply the same logic.

  • Way 4: You can create a listener that the fragments must implement and when calling onBackPressed, then call the listener and do whatever you need to do.

If you need code examples tell me and I'll add it gladly.

EDIT 1:

Keep in mind that this is pseudocode, it may contain any typo or something, check it properly with the compiler.

In your MainActivity.java:

public class MainActivity extends FragmentActivity {

   // Code... 

   private Fragment mCurrentFragment;

   // Code...

   private void displayView(int position) {
      switch (position) {
         case 0:
           mCurrentFragment = new MyFeedsFragment();
           break;
         // Substitute fragment for mCurrentFragment in the rest of the method...
   }

  @Override
  public void onBackPressed() {
      if (mCurrentFragment instanceof LogOutFragment) {
        finish();
      } else {
         // Do whatever you want to do if necessary
      }
  }

}

Upvotes: 0

Naren
Naren

Reputation: 1

Put the following code in your MainActivity().java

    @Override
public void onBackPressed()
{
    // Do Here what ever you want do on back press;
    finish();
}

Upvotes: 0

Marius
Marius

Reputation: 820

Remove addToBackStack() from here: .addToBackStack(null).commit();

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)

Upvotes: 1

Related Questions