美文网首页
FragmentTabHost切换不重新加载UI

FragmentTabHost切换不重新加载UI

作者: 锐心凌志 | 来源:发表于2019-01-28 11:07 被阅读0次

    FragmentTabHost切换不重新加载UI。(不刷新数据),

    第一种:重写FragmentManager发现判断parent方法不生效,事件全部失效

     private View rootView;//缓存Fragment view  
          
        @Override  
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
            if(rootView==null){  
                rootView=inflater.inflate(R.layout.tab_fragment, null);  
            }  
     //缓存的rootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。  
            ViewGroup parent = (ViewGroup) rootView.getParent();  
            if (parent != null) {  
                parent.removeView(rootView);  
            }   
            return rootView;  
        }  
    

    //网上大都是这个说法。切换还是刷新数据,事件不生效
    最终解决:看源码的时候发现FragmentTabHost在doTabChanged()方法中 每次都重新add 一个fragment进去。

    复制appV4下面的FragmentTabHost类,重写该类,找到doTabChanged方法,修改如下:

    @Nullable
    private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {
        TabInfo newTab = null;
        for (int i=0; i<mTabs.size(); i++) {
            TabInfo tab = mTabs.get(i);
            if (tab.tag.equals(tabId)) {
                newTab = tab;
            }
        }
        if (newTab == null) {
            throw new IllegalStateException("No tab known for tag " + tabId);
        }
        if (mLastTab != newTab) {
            if (ft == null) {
                ft = mFragmentManager.beginTransaction();
            }
            if (mLastTab != null) {
                if (mLastTab.fragment != null) {
                    // 将detach替换为hide,隐藏Fragment
                    // ft.detach(mLastTab.fragment);
                    ft.hide(mLastTab.fragment);
                }
            }
            if (newTab != null) {
                if (newTab.fragment == null) {
                    newTab.fragment = Fragment.instantiate(mContext,
                            newTab.clss.getName(), newTab.args);
                    ft.add(mContainerId, newTab.fragment, newTab.tag);
                } else {
                    // 将attach替换为show,显示Fragment
                    // ft.attach(newTab.fragment);
                    ft.show(newTab.fragment);
                }
            }
    
            mLastTab = newTab;
        }
        return ft;
    }
    

    修改add为show

    在布局中改为自定义的view,clean运行就好了

    要刷新的界面就要做局部刷新或者下拉刷新了,这样就不用保存fragment的切换状态中的数据,下拉就可以刷新想要刷新的界面的数据了。

    相关文章

      网友评论

          本文标题:FragmentTabHost切换不重新加载UI

          本文链接:https://www.haomeiwen.com/subject/idxajqtx.html