使用导航抽屉处理片段后栈

时间:2014-04-25 12:30:45

标签: android android-fragments

我正在实施导航抽屉并且效果很好。所以我在导航抽屉点击上调用片段,它也在工作,而且我正在调用主页片段中的另一个片段,并为每个片段维护后台堆栈,但问题是从子片段重新按下我不能去主页片段,刚退出应用程序。我不想要这个。我想要点击

Navigation Drawer->HomePageFragment->AnotherChild Fragment(On List Item click of HomePageFragment)

但是在没有前往Homepage片段的情况下按下它直接退出应用程序。这是我的代码:(In Fragment Activity with Navigation Drawer)

class SlideitemListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {

        updateDisplay(position);
    }

}

private void updateDisplay(int position) {
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new ScheduleFragment();
        break;
    case 1:
        fragment = new Result_Fragment();
        break;
    case 2:
        fragment = new Live_Match_Fragment();
        break;
    case 3:
        // fragment = new Live_Match_Fragment();
        break;

    case 4:
        fragment = new Team_Fragment();
        break;
    default:
        break;
    }

    if (fragment != null) {

        fragmentManager = getFragmentManager();
        fragmentManager.popBackStackImmediate("0", 0);
        int count = fragmentManager.getBackStackEntryCount();
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        fragmentTransaction.replace(R.id.frame_container, fragment)
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .addToBackStack(String.valueOf(count)).commit();
        Log.e("Count in Activiy", ""+count);

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

}

现在位于BackPressed()的{​​{1}}。

FragmentActivity

现在从@Override public void onBackPressed() { if (fragmentManager.getBackStackEntryCount() <= 1) { finish(); return; } super.onBackPressed(); } 项目点击HomePage片段调用另一个子片段。

Listview

所以任何人都知道然后帮助我。帮助将是欣赏。

3 个答案:

答案 0 :(得分:3)

android中存在嵌套片段的问题 https://code.google.com/p/android/issues/detail?id=40323

如果交易是嵌套片段,Android无法很好地处理后退。 为了超越这个我在My Activity中使用以下修复

@Override
public void onBackPressed() {
    // If the fragment exists and has some back-stack entry
    if (myFragment != null && myFragment.getChildFragmentManager().getBackStackEntryCount() > 0) {
        // Get the fragment fragment manager - and pop the backstack
        myFragment.getChildFragmentManager().popBackStack();
    }
    // Else, nothing in the direct fragment back stack
    else {
        // Let super handle the back press
        super.onBackPressed();
    }
}

答案 1 :(得分:0)

当您按下碎片内部的后退按钮onBackPressed()时,如果您声明了活动,则会调用您的活动方法。因此,导航抽屉内的碎片处理后退按钮可以是这样的方式..

MainActvity

     public static boolean isMainActivityShown ;
     public static boolean isFragment1Shown=false ;
     public static boolean isFragment2Shown=false ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        isMainActivityShown=true  //inside onCreate method put isMainActivityShown true
. 
. 
.


 {
               Fragment currentFragment = new Fragment1();
               isMainActivityShown=false;   //when moving to fragment1 
               isFragment1Shown=true;
               frgManager = getFragmentManager();
               frgManager.beginTransaction().replace(R.id.content_frame, currentFragment)
                                        .commit();
 }
.
.
}



  @Override
        public void onBackPressed() {

            if(isMainActivityShown)
            {
                finish();
            }
            else if(isFragment1Shown)
            {
               //write the code to handle back button when you are in Fragment1
            }
           else if(isFragment2Shown)
            {  //When you are in Fragment 2 pressing back button will move to fragment1
                Fragment currentFragment = new Fragment1();
                isFragment2Shown=false;
                isFragment1Shown=true;

                FragmentManager frgManager;
                frgManager = getFragmentManager();
                frgManager.beginTransaction().replace(R.id.content_frame, currentFragment)
                        .commit();
            }

            }

片段1

Fragment currentFragment = new Fragment2();
MainActivity.isFragment1Shown=false;
MainActivity.isFragment2Shown=true;
frgManager = getFragmentManager();
frgManager.beginTransaction().replace(R.id.content_frame, currentFragment)
                                    .commit();

答案 2 :(得分:0)

现在你可以替换fragmentManager.popBackStack()的finish(),android.support.v4.app.FragmentManager的方法