FragmentTabHost切换不重新加载UI

2019-01-28  本文已影响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的切换状态中的数据,下拉就可以刷新想要刷新的界面的数据了。

上一篇 下一篇

猜你喜欢

热点阅读