所以这是一个复杂的问题,但我会尽量让它变得容易.

首先,我有一个带有视图寻呼机的主要活动.其中有2个页面,每个页面都有2个操作栏标签.
我还有一个抽屉有4个选项,前两个是视图寻呼机中的2个页面,第二个是不是的页面.如果您选择第二个中的一个,我将我的ViewPager配置为用另外两个片段交换片段.所有这些片段都是单例,因此来回切换不会导致任何内存问题.

在切换到第二组片段时,其中一个片段中有一个框架,用于在选择按钮时交换子片段.这就是问题所在.在第一次加载该片段后,它可以正常工作.但是如果你使用抽屉切换到第一组,然后再次回到第二组,子片段就会消失.在那之后你做任何其他事情后,它往往会崩溃.

这是它的崩溃日志

01-10 15:55:05.272: E/MessageQueue-JNI(21034): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(android.support.v4.app.Fragment)' on a null object reference

如果我在代码中玩一下,我会得到类似的东西.这两个错误是我似乎产生的最多错误:

01-10 16:00:13.072: E/AndroidRuntime(22227): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.classLoader android.support.v4.app.FragmentActivity.getClassLoader()' on a null object reference

我可以继续在框架视图上调用replace(),因此它不会消失.所以我猜这不是问题.它

这是一些相关的代码.

片段的代码:

public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.calculator,container,false);
    final FragmentManager fragmentManager = getChildFragmentManager();
    if(afFrag == null && topFrag == null){
        afFrag = CalculatorAfFragment.getInstance();
        topFrag = CalculatorTopFragment.getInstance();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.calc_frame,afFrag,"afFrag").commit();
    }
    RadioGroup typeGroup = (RadioGroup) view.findViewById(R.id.type_buttons);        
    typeGroup.setonCheckedchangelistener(new OnCheckedchangelistener() 
    {
        public void onCheckedChanged(RadioGroup group,int checkedId) {
            if (checkedId == R.id.af_button){
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.calc_frame,"afFrag").commit();
            }
            else if (checkedId == R.id.top_button){
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.calc_frame,topFrag,"topFrag").commit();
            } 
        }
    });
    return view;

FragmentStatePagerAdapter代码:

@Override
    public Fragment getItem(int position) {
        if(tools){
            return toolsFragmentsList.get(position);
        } else {
            return guidesFragmentsList.get(position);
        }
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

    public void swapFragments(int position){
        if (tools){
            tools = false;
            stores = false;
            notifyDataSetChanged();
            this.setPrimaryItem(mPager,position-1,getItem(position - 1));
        } else {
            tools = true;
            notifyDataSetChanged();
            this.setPrimaryItem(mPager,position-4,getItem(position - 4));
        }
    }

解决方法

尝试通过mPager.setId(View.generateViewId())在ViewPager上设置唯一ID.

android – 视图寻呼机片段中的子片段在交换后消失的更多相关文章

  1. Android和Eclipse 2同一个应用程序的不同版本

    你好我是一个开始Android开发人员使用Windows和eclipseIDE开发javaandroid应用程序.我已经发布了一个游戏,但有一个免费版本的游戏和付费版本.谷歌市场坚持认为不同的版本必须有不同的包名.到目前为止,我一直在使用2个不同的名称重构包,并在每次构建不同版本时更改R资源文件导入.两个版本的代码都是99%相同.有更好的方法吗?

  2. android – 视图寻呼机片段中的子片段在交换后消失

    所以这是一个复杂的问题,但我会尽量让它变得容易.首先,我有一个带有视图寻呼机的主要活动.其中有2个页面,每个页面都有2个操作栏标签.我还有一个抽屉有4个选项,前两个是视图寻呼机中的2个页面,第二个是不是的页面.如果您选择第二个中的一个,我将我的ViewPager配置为用另外两个片段交换片段.所有这些片段都是单例,因此来回切换不会导致任何内存问题.在切换到第二组片段时,其中一个片段中有一个框架,用于

  3. JS正则表达式替换字符串replace()方法实例代码

    正则表达式是用于匹配字符串中字符组合的模式,在js中正则表达式是对象,这篇文章主要给大家介绍了关于JS正则表达式替换字符串replace()方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  4. python如何使用replace做多字符替换

    这篇文章主要介绍了python如何使用replace做多字符替换,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  5. Javascript中replace方法与正则表达式的结合使用教程

    replace方法是javascript涉及到正则表达式中较为复杂的一个方法,严格上说应该是string对象的方法,下面这篇文章主要给大家介绍了关于Javascript中replace方法与正则表达式的结合使用的相关资料,需要的朋友可以参考下

  6. 关于JavaScript中string 的replace

    在使用JavaScript对字符串进行处理的时候我们经常会用到replace方法,很简单的一个方法,以前一直不以为意,直到今天看JavaScript语言精粹的时候读到了一个有趣的小例子的时候,并不是十分理解,了解了一下replace的用法才明白,原来replace不像想象中的那么简单

  7. 详解PHP字符串替换str_replace()函数四种用法

    str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。本文重点给大家介绍PHP字符串替换str_replace()函数四种用法,感兴趣的朋友一起看看吧

  8. 初学JS的的小例子 javascript replace高亮替换

    JS实现关键字高亮显示a曾经有一份真挚的爱情拜在我面前,明明我却睡着了……

  9. JavaScript replace(rgExp,fn)正则替换的用法

    再看jQuery源码的时候遇到了replace中参数为函数的用法,正好复习一下replace正则替换的用法。

  10. JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)

    这篇文章主要介绍了JavaScript字符串对象replace方法实例,replace方法用于字符串替换,同时支持正则表达式替换,需要的朋友可以参考下

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部