关于android视图分页器中嵌套片段中的后栈的问题

时间:2014-04-04 05:06:01

标签: android android-fragments back-stack

我开发了一个有一个活动的应用程序,在这个活动中抽屉里有很多片段,在一个片段中我设置了视图分页器,用于显示多个片段实例,它的工作完美但是当我在视图寻呼机中打开另一个片段时(嵌套)片段),它的工作但当我按下按钮时它的整个应用程序关闭所以在片段管理器中的后栈中有什么问题我使用了子片段管理器所以我想要实现就像当我按下它时它是打开的前片段

我的代码是

    pageAdapter = new MyPageAdapter(getChildFragmentManager(), Global.DatabaseHandler.DisplayTempleList(), activityType);

        pager = (ViewPager) v.findViewById(R.id.pager);
        pager.setAdapter(pageAdapter);
        indicator = (TabPageIndicator) v.findViewById(R.id.indicator);
        indicator.setViewPager(pager);


        return v;
    }

//    private List<Fragment> getFragments() {
//
//        List<Fragment> fList = new ArrayList<Fragment>();
//        //TempleLists = Global.DatabaseHandler.DisplayTempleList();
//
//        for (TempleDetail templeDetail : TempleLists.Temple) {
//            if (activityType == Global.About) {
//                fList.add(new About_Fragment(templeDetail.temple_id, templeDetail.temple_name));
//            } else if (activityType == Global.DailyDarshan) {
//                fList.add(new DailyDarshan_Activity(templeDetail.temple_id, templeDetail.temple_name));
//            } else if (activityType == Global.PhotoGallery) {
//                fList.add(new PhotoGallery_Activity(templeDetail.temple_id, templeDetail.temple_name));
//            }
//        }
//
//        return fList;
//    }

    private class MyPageAdapter extends FragmentPagerAdapter {
        private HashMap<Integer, Fragment> fragments;
        private TempleList TempleLists;
        private String ActivityType;

        //public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
        public MyPageAdapter(FragmentManager fm, TempleList templeList, String activityType) {
            super(fm);
            fragments = new HashMap<Integer, Fragment>();
            TempleLists = templeList;
            ActivityType = activityType;
        }

        @Override
        public Fragment getItem(int position) {

            if (!fragments.containsKey(position)) {
                Fragment fragment = new Sub_container(TempleLists.Temple.get(position).temple_id,
                        TempleLists.Temple.get(position).temple_name, ActivityType);
                fragments.put(position, fragment);
            }

            return this.fragments.get(position);
        }

        @Override
        public int getCount() {
            return TempleLists.Temple.size();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            //return TempleLists.Temple.get(position % TempleLists.Temple.size()).temple_name.toUpperCase();
            return TempleLists.Temple.get(position).temple_name.toUpperCase();
        }
    }

}


other fragment 

         Fragment fragment = new FullImageActivity();

                FragmentTransaction transaction =  getFragmentManager ().beginTransaction();
                transaction.add(R.id.sub_container, fragment);
                transaction.addToBackStack(null);
                transaction.commit();

                Bundle args = new Bundle();
                args.putInt(Global.Id, position);
                args.putString(Global.TempleId, getArguments().getString(Global.TempleId));
                fragment.setArguments(args);

我的背部密码

    @Override
public void onBackPressed() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    Log.i("-----------------", "---------------" + getFragmentManager().getBackStackEntryCount() + "---------");
    if (fragmentManager.getBackStackEntryCount() == 0) {
        if (doubleBackToExitPressedOnce) {

            super.onBackPressed();
            return;
        }
        this.doubleBackToExitPressedOnce = true;
        Global.interstitial.loadAd(Global.adRequest);
        Toast.makeText(this, "Press Again to Exit", Toast.LENGTH_SHORT).show();
    } else {
        fragmentManager.popBackStack();
        removeCurrentFragment();
    }
}

1 个答案:

答案 0 :(得分:3)

您必须在Backstack中添加嵌套片段,

 public void changePage(int id, Fragment frag) {

    String backStateName = frag.getClass().getName();
    changePage(id, frag, backStateName);
}



public void changePage(int id, Fragment frag, String backStateName) {

    imm.hideSoftInputFromWindow(backView.getWindowToken(), 0);

    transaction = fragmentManager.beginTransaction();

    transaction.setCustomAnimations(R.animator.righttoleft_1, R.animator.righttoleft_2, R.animator.lefttoright_1, R.animator.lefttoright_2);

    boolean fragmentPopped = fragmentManager.popBackStackImmediate (backStateName, 0);

     if (!fragmentPopped){ //fragment not in back stack, create it.

        transaction.replace(id, frag);
        transaction.addToBackStack(backStateName);
        transaction.commit();
      }

}

并将此代码添加到您的活动中。

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub


    if (fragmentManager.getBackStackEntryCount() > 1) {
        Log.i("MainActivity", "popping backstack");
        fragmentManager.popBackStack();
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();
    }
}