Android 使用导航抽屉处理片段返回堆栈

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23293245/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 06:59:08  来源:igfitidea点击:

Handling fragment back stack with Navigation Drawer

androidandroid-fragments

提问by Piyush

I am implementing navigation drawer and works well. So i am calling fragment on navigation drawer click and it is also working and further more i am calling another fragment from Home page fragment and maintain the back stack for every fragment but the problem is back press from the child fragment i can't go to Home page fragment and just exited from application. I don't want this. What i want Click on

我正在实施导航抽屉并且运行良好。所以我在导航抽屉点击时调用片段,它也在工作,而且我正在从主页片段调用另一个片段并维护每个片段的返回堆栈,但问题是从我不能去的子片段反压主页片段,刚刚退出应用程序。我不要这个。我想要什么 点击

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

but on back pressed without going to Homepagefragment its directly exit with application. Here is my code: (In Fragment Activity with Navigation Drawer)

但是在后面按下而不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");
    }

}

Now in BackPressed()in FragmentActivity.

现在BackPressed()FragmentActivity.

@Override
public void onBackPressed() {
    if (fragmentManager.getBackStackEntryCount() <= 1) {
        finish();

        return;
    }
    super.onBackPressed();
}

Now calling another child fragment from HomePagefragment on Listviewitem click.

现在HomePageListview单击项目时从片段调用另一个子片段。

 team_lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            TeamDetailFragment myDetailFragment = new TeamDetailFragment();
            FragmentManager fragmentManager = getFragmentManager();
            int count = fragmentManager.getBackStackEntryCount();
            Log.e("Count in Fragment", "" + count);
            FragmentTransaction fragmentTransaction = fragmentManager
                    .beginTransaction();
            fragmentTransaction
                    .replace(R.id.frame_container, myDetailFragment)
                    .setTransition(
                            FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .addToBackStack(String.valueOf(count)).commit();

        }
    });

So anybody knows then help me. Help will be appreciate.

所以任何人都知道然后帮助我。帮助将不胜感激。

回答by Rostislav Pashuto

There is an issue with nested fragments in android https://code.google.com/p/android/issues/detail?id=40323

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

Android doesn't handle back press well if transactions were in nested fragments. To surpass this i am using the following fix inside My Activity

如果事务处于嵌套片段中,Android 不能很好地处理反压。为了超越这一点,我在“我的活动”中使用以下修复程序

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

回答by f_ficarola

I've solved in the following way:

我已经通过以下方式解决了:

1st solution

第一个解决方案

@Override
public void onBackPressed() {
    FragmentManager fragmentManager = getFragmentManager();
    int backCount = fragmentManager.getBackStackEntryCount();

    if(backCount > 1) {
        super.onBackPressed();
    } else {
        finish();
    }
}

2nd solution

第二种解决方案

@Override
public void onBackStackChanged() {
    FragmentManager fragmentManager = getFragmentManager();
    int backCount = fragmentManager.getBackStackEntryCount();

    if(backCount == 0) {
        finish();
    }
}

These allow you to exploit the Android stack when you replace your fragment:

这些允许您在替换片段时利用 Android 堆栈:

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, yourFragment)
    .addToBackStack(null).commit();

回答by Edgardo Andrés

Now you can replace finish() for fragmentManager.popBackStack(), method of android.support.v4.app.FragmentManager

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

回答by Android Developer

When you press back button inside your fragment onBackPressed() method of your activity will be called if you have declared that..So handling back button for fragments within navigation drawer can be one in this way..

当你在你的片段中按下后退按钮时,如果你已经声明了,你的活动的 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();
            }

            }

Fragment1

片段1

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