java - 如何使用后退选项 fragment 在android中进行 fragment 化

标签 java android android-fragments

从一个 fragment 到另一个 fragment ,后按不起作用。(我的应用程序包含抽屉导航和选项卡 View 。)我的主要 Activity 代码如下。我已经添加了后按方法,请帮助我....

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

            }

最佳答案

在你的 activity 里面它处理所有 fragment ,使用

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

当fragment backstack entry count为0时,表示所有的fragment都被pop出backstack。所以你只要执行 super.onBackPressed()然后。但是,当堆栈不为空时,当您按下后退按钮时,您需要从后退堆栈中弹出最顶部的 fragment ,以便进行正确的后退导航。

注意:使用getFragmentManager().getBackStackEntryCount()而不是 getSupportFragmentManager().getBackStackEntryCount()如果您要导入 android.app.Fragment .

编辑

现在您已经更改了 onBackPressed() 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");
            }

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

关于java - 如何使用后退选项 fragment 在android中进行 fragment 化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31623323/

相关文章:

java - 接口(interface)实例如何访问Object类的方法?

android - 在移动版本中单击某个元素时,该元素会变成灰色

android - ViewPager 转换到下一个 Pane 的回调?

android - 仅在父 fragment 中的操作栏中显示搜索 View

java - 使用 Spring 从 Angular 表单中恢复数据

java - 从 csv 文件打印特定行

java - 如何使用java读取https页面内容?

Android 10 MediaStore 更新镜像 RecoverableSecurityException

java - 如何使用带有 JSON 数据的 RoboSpice Google Http Java 客户端模块上传文件

android - 加载 fragment 时出现 NullPointerException