简体   繁体   中英

How to use back pressed options fragment to fragment in android

Back press is not working from fragment to fragment.(my application contains navigation drawer and Tab view.) My Main Activity code is given below.i have added the back press method please help me....

            public class Main Activity extends Activity   {

                ImageView image;
                private DrawerLayout mDrawerLayout;
                private ListView mDrawerList;
                private ActionBarDrawerToggle mDrawerToggle;
                // nav drawer title
                private CharSequence mDrawerTitle;
                // used to store app title
                private CharSequence mTitle;
                // slide menu items
                private String[] navMenuTitles;
                private TypedArray navMenuIcons;
                private ArrayList<NavDrawerItem> navDrawerItems;
                private NavDrawerListAdapter adapter;

                ExpandableListView expListView;

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

                    Runtime.getRuntime().maxMemory();
                    // load slide menu items
                    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

                    // nav drawer icons from resources
                    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>();
                    // Home
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0],  navMenuIcons.getResourceId(0, -1)));
                    // Find People
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1],  navMenuIcons.getResourceId(1, -1)));
                    // Photos
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[2],  navMenuIcons.getResourceId(2, -1)));
                    // Communities, Will add a counter here
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[3],  navMenuIcons.getResourceId(3, -1)));
                    // Pages
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[4],  navMenuIcons.getResourceId(4, -1)));
                    // What's hot, We  will add a counter here
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5],  navMenuIcons.getResourceId(5, -1)));
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[6],  
                    // Recycle the typed array
                    navMenuIcons.recycle();

                    mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
                   // mDrawerLayout.setBackgroundDrawable(new ColorDrawable(R.drawable.border));
                    // setting the nav drawer list adapter
                    adapter = new NavDrawerListAdapter(getApplicationContext(),
                            navDrawerItems);
                    mDrawerList.setAdapter(adapter);
                    ActionBar actionBar = getActionBar();
                    // enabling action bar app icon and behaving it as toggle button
                    getActionBar().setDisplayHomeAsUpEnabled(true);
                    getActionBar().setHomeButtonEnabled(true);
                    actionBar.setHomeButtonEnabled(true);
                    actionBar.setBackgroundDrawable(new ColorDrawable(Color.WHITE));

                    actionBar.setCustomView(R.layout.custom_view);
                    // actionBar.setCustomView(R.layout.custom_view1);
                    actionBar.setDisplayShowCustomEnabled(true);
                    actionBar.show();
                    addListenerOnButton();

                    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                            R.drawable.draw,//nav menu toggle icon
                            R.string.app_name, // nav drawer open - description for accessibility
                            R.string.app_name // nav drawer close - description for accessibility
                    ) {
                        public void onDrawerClosed(View view) {
                            getActionBar().setTitle(mTitle);
                            // calling onPrepareOptionsMenu() to show action bar icons
                            invalidateOptionsMenu();
                        }

                        public void onDrawerOpened(View drawerView) {
                            getActionBar().setTitle(mDrawerTitle);
                            // calling onPrepareOptionsMenu() to hide action bar icons
                            invalidateOptionsMenu();
                        }
                    };
                    mDrawerLayout.setDrawerListener(mDrawerToggle);

                    if (savedInstanceState == null) {
                        // on first time display view for first nav item
                        displayView(0);
                    }
                }

                /**
                 * Slide menu item click listener
                 * */

                private class SlideMenuClickListener implements
                        ListView.OnItemClickListener {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
                        // display view for selected nav drawer item
                        displayView(position);
                    }
                }

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

                @Override
                public boolean onOptionsItemSelected(MenuItem item) {
                    // toggle nav drawer on selecting action bar app icon/title
                    if (mDrawerToggle.onOptionsItemSelected(item)) {

                    }

                    return true;

                }


                /**
                 * Diplaying fragment view for selected nav drawer list item
                 * */
                private void displayView(int position) {
                    // update the main content by replacing fragments
                    Fragment fragment = null;

                    switch (position) {
                    case 0:
                         fragment = new FirstFragment();
                         break;
                    case 1:
                         fragment = new HomeFragment();
                         break;
                    case 2:
                        fragment = new FindPeopleFragment();
                        break;
                    case 3:
                        fragment = new PhotosFragment(); 
                        break;
                    case 4:
                        fragment = new PagesFragment();
                        break;
                    case 5:
                        fragment = new CommunityFragment();
                        break;

                    default:
                        break;
                    }
 **Edited Code:**               

if (fragment != null) {
             FragmentManager fragmentManager = getFragmentManager();

             FragmentTransaction ft = fragmentManager.beginTransaction();

             ft.addToBackStack(null);
             ft.replace(R.id.frame_container, fragment);

            // Add this transaction to the back stack, so when the user presses back,// it rollbacks.

            ft.commit();

                        // update selected item and title, then close the drawer
                        mDrawerList.setItemChecked(position, true);
                        mDrawerList.setSelection(position);
                        setTitle(navMenuTitles[position]);
                        mDrawerLayout.closeDrawer(mDrawerList);
                    } else {
                        // error in creating fragment
                        Log.e("MainActivity", "Error in creating fragment");
                    }



                }
                @Override
                public void setTitle(CharSequence title) {
                    mTitle = title;
                    getActionBar().setTitle(mTitle);
                }

                private void addListenerOnButton() {
                    // TODO Auto-generated method stub

                    image = (ImageView) findViewById(R.id.actionBarLogo);

                    image.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {

                            Fragment fd2 = new MovieActivity();


                            android.app.FragmentTransaction  ft2 =
                                    getFragmentManager().beginTransaction();
                                          ft2.replace(R.id.frame_container, fd2); 
                                          ft2.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                                          ft2.addToBackStack(null);
                                          ft2.commit();


                        }
                    });
                }
                @Override
                public void onBackPressed() {
            int count = getFragmentManager().getBackStackEntryCount();
            if (count == 0) {           
            super.onBackPressed();            
            }
            else {            
                getFragmentManager().popBackStack();            
               }
        }
                @Override
                protected void onPostCreate(Bundle savedInstanceState) {
                    super.onPostCreate(savedInstanceState);
                    // Sync the toggle state after onRestoreInstanceState has occurred.
                    mDrawerToggle.syncState();
                }

                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    super.onConfigurationChanged(newConfig);
                    // Pass any configuration change to the drawer toggls
                    mDrawerToggle.onConfigurationChanged(newConfig);
                }

            }

Inside your activity which handles all the fragments , use

@Override
public void onBackPressed() {
    int count = getSupportFragmentManager().getBackStackEntryCount();
    if (count == 0) {           
    super.onBackPressed();            
    }
    else {            
          getSupportFragmentManager().popBackStack();            
       }
}

When the fragment backstack entry count is 0 , it means all the fragments are popped out of the backstack. So you just execute the super.onBackPressed() then. However when the stack is not empty , when you press back button you need to pop the top most fragment from the backstack so that proper back navigation happens.

Note : use getFragmentManager().getBackStackEntryCount() instead of getSupportFragmentManager().getBackStackEntryCount() if you are importing android.app.Fragment .

Edit

Now that you have changed your onBackPressed() code , next thing to do is change this in your code.

  if (fragment != null) {
     FragmentManager fragmentManager = getFragmentManager();

     FragmentTransaction ft = fragmentManager.beginTransaction();

     ft.replace(R.id.frame_container, fragment);

    // Add this transaction to the back stack, so when the user presses back,// it rollbacks.

    ft.addToBackStack("Give a Tag for the fragment here");
    ft.commit();

                // update selected item and title, then close the drawer
                mDrawerList.setItemChecked(position, true);
                mDrawerList.setSelection(position);
                setTitle(navMenuTitles[position]);
                mDrawerLayout.closeDrawer(mDrawerList);
            } else {
                // error in creating fragment
                Log.e("MainActivity", "Error in creating fragment");
            }

Basically what we are doing here is adding a particular fragment to the fragment backstack while replacing it so that while onBackPressed() of activity is executed count variable will store the number of fragments present in the fragment backstack , and proper back navigation occurs then.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM