当前位置:首页 > Android

Fragment保持状态切换

jsc10年前 (2016-04-01)Android4457

在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常挂掉

网上说使用replace切换会使被切换的Fragment给替换掉,从而被被切换的Fragment的view从viewtree中删除,致使切换过程中每次都要重新创建Fragment

每次使用add添加Fragment,当再次切换到时用show显示,而被切换的Fragment用hide隐藏,具体代码如下:

/**
     * Fragment跳转
     * @param fm
     * @param fragmentClass
     * @param tag
     * @param args
     */
    public void turnToFragment(Class<? extends Fragment> fromFragmentClass, Class<? extends Fragment> toFragmentClass, Bundle args) {
        
        FragmentManager fm = getSupportFragmentManager();
        //被切换的Fragment标签
        String fromTag = fromFragmentClass.getSimpleName();
        //切换到的Fragment标签
        String toTag = toFragmentClass.getSimpleName();
        //查找切换的Fragment
        Fragment fromFragment = fm.findFragmentByTag(fromTag);
        Fragment toFragment = fm.findFragmentByTag(toTag);
        //如果要切换到的Fragment不存在,则创建
        if (toFragment == null) {
            try {
                toFragment = toFragmentClass.newInstance();
                toFragment.setArguments(args);
            } catch (java.lang.InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        //如果有参数传递,
        if( args != null && !args.isEmpty() ) {
            toFragment.getArguments().putAll(args);
        }
        //Fragment事务
        FragmentTransaction ft = fm.beginTransaction();
        //设置Fragment切换效果
        ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,
                android.R.anim.fade_in, android.R.anim.fade_out);
        /**
         * 如果要切换到的Fragment没有被Fragment事务添加,则隐藏被切换的Fragment,添加要切换的Fragment
         * 否则,则隐藏被切换的Fragment,显示要切换的Fragment
         */
        if( !toFragment.isAdded()) {
            ft.hide(fromFragment).add(R.id.content_frame, toFragment, toTag);
        } else {
            ft.hide(fromFragment).show(toFragment);
        }
        //添加到返回堆
//        ft.addToBackStack(tag);
        //不保留状态提交事务
        ft.commitAllowingStateLoss();
    }

这里有个FragmentTransaction(事务),这个是Fragment切换的核心类,它有两个方法:replace,add,一个是替 换Fragment,一个是添加Fragment,两者的区别是:replace=remove掉旧fragment,add新的fragment,

当我们的应用(即管理多个Fragment的Activity)运行到后台时(即推出当前屏幕),会触发Activity的onPause()方 法,而Activity的onPause()会调用它所管理的Fragment的同样的方法,但是当我使用replace时,已经remove掉了原来的 Fragment,所以当调用原理的Fragment的onPause()方法就回不粗在,就会出现上述xxx is not currently in the FragmentManager的异常推出,有debug为证:

1.jpg

扫描二维码推送至手机访问。

版权声明:本文由微小站发布,如需转载请注明出处。

本文链接:https://jsc0.com/post/55.html

分享给朋友:

“Fragment保持状态切换” 的相关文章

Android动态布局,并动态为TextView控件设置drawableLeft、drawableRight等属性添加图标

Android动态布局,并动态为TextView控件设置drawableLeft、drawableRight等属性添加图标

˂p style="font-family:Arial; font-size:14px; line-height:26px; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0…

android上传图片至服务器

本实例实现了android上传手机图片至服务器,服务器进行保存服务器servlet代码publicvoid doPost(HttpServletRequest request, HttpServletResponse response)&…

Android中的消息通知(NotificationManager和Notification)

下面来谈谈notification,这个notification一般用在电话,短信,邮件,闹钟铃声,在手机的状态栏上就会出现一个小图标,提 示用户处理这个通知,这时手从上方滑动状态栏就可以展开并处理这个快讯。已添加的Notification.Builder,使其更容易构建通知。 notifica…

onTextChanged参数解释及实现EditText字数监听

由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher。它有三个成员方法,第一个after很简单,这个方法就是在EditText内容已经改变之后调用,重点看下面两个方法:beforeTextChanged(CharSequ…

android客户端和java服务端之间用socket来传输图片

一、从服务端向客户端发送图片:服务端的代码:import java.io.DataOutputStream;   import java.io.FileInputStream;   import java.io.IOExcep…