Android同时使用getFragmentManager和getSupportFragmentManager会导致重叠 [英] Android using both getFragmentManager and getSupportFragmentManager causes overlapping

查看:186
本文介绍了Android同时使用getFragmentManager和getSupportFragmentManager会导致重叠的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的活动中有这样的内容:

  @Overridepublic void onNavigationDrawerItemSelected(int position){片段片段= null;切换(位置+1){情况1: {片段=新的Fragment_Login();FragmentManager frgManager = getFragmentManager();frgManager.beginTransaction().replace(R.id.container,fragment).犯罪();休息;}情况2:{SwipeRefreshListFragment swipeFragment = new Fragment_List_Of_Assessments();FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();transaction.replace(R.id.container,swipeFragment).犯罪();休息;}情况3:{片段=新的Fragment_Report();FragmentManager frgManager = getFragmentManager();frgManager.beginTransaction().replace(R.id.container,fragment).犯罪();休息;}情况4:{片段=新的Fragment_Settings();FragmentManager frgManager = getFragmentManager();frgManager.beginTransaction().replace(R.id.container,fragment).犯罪();休息;}默认:休息;}} 

在程序自动加载情形1,但是当选择情形2,getSupportFragmentManager加载片段上情形1的顶部上.我想同时使用supportFragmentManager和FragmentManager存在一些问题.他们似乎有自己的栈.问题是我不能只使用其中之一,因为SwipeToRefresh Android示例使用的ListView需要support.v4.Fragment,它需要旧的FragmentManager.那么如何将两个FragmentManagers集成在一起?

解决方案

使用PreferenceFragment(支持库版本不支持)时,我已经完成了类似的操作.为了实现这一点,我在Activity中保留了一对布尔值( isLastFragmentSupportType lastFragmentShowed ),还有一个字符串( lastFragmentTag ).

一开始,您的Activity会将它们都设置为false.并且,当您添加新的Fragment时,请使用这两个布尔值来知道是否需要清除其他 FragmentManager .我将以您的代码为例:

  @Overridepublic void onNavigationDrawerItemSelected(int position){片段片段= null;切换(位置+1){情况1: {if(isLastFragmentSupportType&& lastFragmentShowed){//由于您的最后一个片段是支持类型,因此您需要清除supportFragmentManagerandroid.support.v4.app.Fragment fr_v4 = getSupportFragmentManager().findFragmentByTag(lastFragmentTag);getSupportFragmentManager().beginTransaction().remove(fr_v4).commit();}片段=新的Fragment_Login();FragmentManager frgManager = getFragmentManager();frgManager.beginTransaction().replace(R.id.container,fragment,TAG1).犯罪();lastFragmentTag = TAG1;lastFragmentShowed = true;isLastFragmentSupportType = false;休息;}//以此类推 

您需要检查将要使用的片段类型(是否支持),并检查这些变量以查看最后一个片段是否为其他类型.如果是这种情况,请清洁另一个fragmentmanager,以清除"屏幕,使它们不会重叠.

还使用TAGS来识别和检索您当前的片段,因此您无需在代码上使用 Fragment 变量.

最后使用 onSavedInstanceState ,以便在需要时保留这些值.

希望它会有所帮助:)

I have something like this inside my activity:

@Override
    public void onNavigationDrawerItemSelected(int position) {
        Fragment fragment = null;
        switch (position+1) {
            case 1: {
                fragment = new Fragment_Login();
                FragmentManager frgManager = getFragmentManager();
                frgManager.beginTransaction().replace(R.id.container, fragment)
                        .commit();
                break;
            }
            case 2: {
                SwipeRefreshListFragment swipeFragment = new Fragment_List_Of_Assessments();
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.container, swipeFragment)
                        .commit();
                break;
            }
            case 3: {
                fragment = new Fragment_Report();
                FragmentManager frgManager = getFragmentManager();
                frgManager.beginTransaction().replace(R.id.container, fragment)
                        .commit();
                break;
            }
            case 4: {
                fragment = new Fragment_Settings();
                FragmentManager frgManager = getFragmentManager();
                frgManager.beginTransaction().replace(R.id.container, fragment)
                        .commit();
                break;
            }
            default:
                break;
        }
    }

The program automatically loads case1, but when case2 is selected, getSupportFragmentManager loads the Fragment on top of case1. I guess there are some problem with using both supportFragmentManager and FragmentManager. They seem to have their own stack. The problem is that I cannot use only either one of them because the SwipeToRefresh Android example uses ListView which needs support.v4.Fragment which needs the old FragmentManager. So how is it possible to integrate both FragmentManagers together?

解决方案

I have accomplished something like this when using PreferenceFragment (not supported by support library version). In order to achieve this I kept inside my Activity a pair of boolean (isLastFragmentSupportType and lastFragmentShowed) and also a String (lastFragmentTag).

At the beginning your Activity will have both of them to false. And when you add a new Fragment you use these 2 boolean to know if you need to clean the other FragmentManager or not. I'll use your code as an example:

@Override
public void onNavigationDrawerItemSelected(int position) {
    Fragment fragment = null;
    switch (position+1) {
        case 1: {
            if(isLastFragmentSupportType && lastFragmentShowed)
            {//As your last fragment  was a support type you need to clear your supportFragmentManager
              android.support.v4.app.Fragment fr_v4 = getSupportFragmentManager().findFragmentByTag(lastFragmentTag);
               getSupportFragmentManager().beginTransaction().remove(fr_v4).commit();
            }
            fragment = new Fragment_Login();
            FragmentManager frgManager = getFragmentManager();
            frgManager.beginTransaction().replace(R.id.container, fragment,TAG1)
                    .commit();
          lastFragmentTag = TAG1;
          lastFragmentShowed = true;
          isLastFragmentSupportType = false; 
            break;
        }
       //And so on with the others

You need to check what type (support or not) of fragment you are going to use, and check these variables to see if the last fragment was of a different type. If that is the case clean the other fragmentmanager to "clear" the screen so they wont overlap.

Also use TAGS to identify and retrieve your current fragments so you do not need to have Fragment variables over your code.

Finally use onSavedInstanceState so as to keep these values in case you need them.

Hope it helps :)

这篇关于Android同时使用getFragmentManager和getSupportFragmentManager会导致重叠的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆