Fragment碎片频繁来回切换的时候报java.lang.IllegalStateException: No activity

出现这个问题的原因是因为使用的transcation.replace(fragmentTwo);的方式进行碎片切换的。

解决方案是使用add和show、hide方法组合实现碎片的切换(应该是显示、隐藏)。

我这里使用的是RadioButton控件的Id值。

/**
     * 切换碎片:使用show和hide以及add,不要使用replace(频繁来回切换的时候容易发生内存溢出的错误)
     */
    public void onTabSelected(int radioGroupId) {
        //开启一个事务
        FragmentTransaction transcation = fragmentManager.beginTransaction();
        //设置淡入淡出效果
        transcation.setCustomAnimations(android.R.animator.fade_in,android.R.animator.fade_out);
        //隐藏全部碎片
        hideFragments(transcation);
        //有选择的显示碎片
        switch (radioGroupId) {

            case R.id.home:
                if(fragmentOne == null){
                    fragmentOne = new FragmentOne();
                    transcation.add(R.id.center_layout, fragmentOne);
                }else{
                    transcation.show(fragmentOne);
                }
                break;

            case R.id.category:
                if(fragmentTwo == null){
                    fragmentTwo = new FragmentTwo();
                    transcation.add(R.id.center_layout, fragmentTwo);
                }else{
                    transcation.show(fragmentTwo);
                }
                break;

            case R.id.collect:
                if(fragmentThree == null){
                    fragmentThree = new FragmentThree();
                    transcation.add(R.id.center_layout, fragmentThree);
                }else{
                    transcation.show(fragmentThree);
                }
                break;

            case R.id.setting:
                if(fragmentFour == null){
                    fragmentFour = new FragmentFour();
                    transcation.add(R.id.center_layout, fragmentFour);
                }else{
                    transcation.show(fragmentFour);
                }
                break;

            default:
                break;
        }
        transcation.commitAllowingStateLoss();
    }

    /**隐藏全部碎片
     * 需要注意:不要在OnResume方法中实例化碎片,因为先添加、显示,才可以隐藏。否则会出现碎片无法显示的问题*/
    private void hideFragments(FragmentTransaction transaction) {
        if (null != fragmentOne) {
            transaction.hide(fragmentOne);
        }
        if (null != fragmentTwo) {
            transaction.hide(fragmentTwo);
        }
        if (null != fragmentThree) {
            transaction.hide(fragmentThree);
        }
        if (null != fragmentFour) {
            transaction.hide(fragmentFour);
        }
    }

需要注意,不要在OnResume方法中实例化碎片。

// 存放底部菜单的各个RadioButton的Id值
    private int[] radioButtonIds = {R.id.home,R.id.category,R.id.collect,R.id.setting};

@Override
    protected void onResume() {

        //切换碎片
        onTabSelected(radioButtonIds[0]);

        super.onResume();
    }
时间: 2024-11-13 08:12:39

Fragment碎片频繁来回切换的时候报java.lang.IllegalStateException: No activity的相关文章

response.sendRedirect 报 java.lang.IllegalStateException 异常的解决思路

今天在进行代码开发的时候,出现了 java.lang.IllegalStateException异常,response.sendRedirect("./DEFAULT.html"); 这一条语句出错. 在网上进行查找之后,发现问题很有可能是因为response.sendRedirect方法执行了两次,其中一次肯定是项目框架里面的跳转,而我自己要进行跳转的话,就显得极其不方便,最后我把目光放到前端页面,在前端页面进行跳转. 一开始我的前端语句是:window.location.href=

关于 java 上传,下载和导入报java.lang.IllegalStateException异常解决办法

java.lang.IllegalStateException异常解决办法 最近在使用response.sendRedirect()时出现如下错误:java.lang.IllegalStateException            org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:423) 经过分析.查看jdk文档终于找到解决的办法,在response.sendRedirect()方法后加

如何进行fragment中的来回切换?

本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术,本文为大家讲解如何进行fragment中的来回切换. 问:Ijaz Ahmed 我想要对fragment中的fragment进行操作,在按后退按钮的时候出现了问题.应用程序主屏幕上有很多按钮,按下每个按钮都会出现新的fragment(它也被包含在另一个fragment内).按下按钮1(已替换fragment),可以进行动态的添加或者是替换片段.如

Fragment java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

首先描述下所要实现的功能点: MainActivity使用Fragment实现底部菜单,底部共有四个菜单按钮,分别对应:AFragment,BFragment,CFragment,DFragment.其中AFragment是默认显示. 点击CFragment中的一个button后跳转到第二个Activity界面:SecondActivity. SecondActivity返回键有两个:button01.button02.其中button01返回的是CFragment:button02返回的是AF

java.lang.IllegalStateException: Fragment already added:

Fragment 相关API getSupportFragmentManager().popBackStack() getFragmentManager().getBackStackEntryCount 其是操作谁的,当一个activity初次显示的时候,其是0还是1. Fragment 具体有几个stack, 前端界面显示stack, 和后端缓存的stack backStack 其属于哪一个stack Activity, fragment, stack 其之间的关联是什么 FragmentMa

一般报java.lang.NullPointerException的原因有以下几种

一般报java.lang.NullPointerException的原因有以下几种: ·字符串变量未初始化: ·接口类型的对象没有用具体的类初始化,比如: List lt; 会报错 List lt = new ArrayList(); 则不会报错了 ·当一个对象的值为空时,你没有判断为空的情况. 你可以试着把下面的代码前加一行代码: if(rb!=null); ................... String类型的对象可以做如下判断 if(rb!==null&&!""

Android开发:java.lang.IllegalStateException报错

常见于ListView列表刷新数据时,更改UI. LOG: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. DDMS中的log无法定位到准确的出错位置.检查错误可

Android程序 依赖库引用Gson 报java.lang.NoClassDefFoundError: com/google/gson/Gson 解决方法

Android 程序所依赖一个Library程序B , B 程序中用到格式化json串,转换成标准json串的要求 public static String jsonFormatter(String uglyJSONString) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonParser jp = new JsonParser(); JsonElement je = jp.parse(uglyJSONStri

关于数据库连接池使用代理报 java.lang.ClassCastException

用到动态代理时会发生这样的错误: java.lang.ClassCastException: $Proxy0 cannot be cast to java.sql.Connection 原因是数据库驱动版本的问题: 当用到: mysql-connector-java-5.0.8-bin.jar 则不会出报错: 但是,当用到: mysql-connector-java-5.1.7-bin.jar (5.1以上) 则会报 java.lang.ClassCastException: $Proxy0 c