简体   繁体   English

如何使用后退选项片段在Android中进行片段

[英]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.... 从片段到片段,反向按不起作用。(我的应用程序包含导航抽屉和Tab视图。)下面提供了我的主要活动代码。我添加了反向按的方法,请帮助我。

            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 在处理所有碎片的activity中,使用

@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. 当片段Backstack条目计数为0时,意味着所有片段都从Backstack中弹出。 So you just execute the super.onBackPressed() then. 因此,您只需执行super.onBackPressed() 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 . 注意:如果要导入android.app.Fragment请使用getFragmentManager().getBackStackEntryCount()而不是getSupportFragmentManager().getBackStackEntryCount()

Edit 编辑

Now that you have changed your onBackPressed() code , next thing to do is change this in your code. 既然您已经更改了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");
            }

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. 基本上,我们在这里要做的是在替换特定片段的同时将其添加到片段堆栈中,以便在执行活动的onBackPressed()count变量将存储片段堆栈中存在的片段数量,然后进行适当的向后导航。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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