如何在android中使用后退选项片段到片段

时间:2015-07-25 05:36:13

标签: java android android-fragments

后退不能从片段到片段工作。(我的应用程序包含导航抽屉和标签视图。)我的主要活动代码如下。我已经添加了背压方法,请帮助我....

            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);
                }

            }

1 个答案:

答案 0 :(得分:1)

在处理所有片段的activity内,使用

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

当片段backstack条目计数为0时,表示所有片段都从backstack中弹出。所以你只需执行super.onBackPressed()即可。但是当堆栈不为空时,当您按下后退按钮时,您需要从后台堆栈中弹出最顶层的片段,以便进行正确的反向导航。

注意:如果要导入getFragmentManager().getBackStackEntryCount(),请使用getSupportFragmentManager().getBackStackEntryCount()代替android.app.Fragment

修改

既然您已经更改了onBackPressed()代码,接下来要做的就是在代码中更改此代码。

  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");
            }

基本上我们在这里做的是将一个特定的片段添加到片段backstack中,同时替换它以便在执行onBackPressed()活动时count变量将存储片段backstack中存在的片段数量,然后进行适当的后退导航。