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



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

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

  1.  private View rootView;//缓存Fragment view  
  2.       
  3.     @Override  
  4.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  5.         if(rootView==null){  
  6.             rootView=inflater.inflate(R.layout.tab_fragment, null);  
  7.         }  
  8.  //缓存的rootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。  
  9.         ViewGroup parent = (ViewGroup) rootView.getParent();  
  10.         if (parent != null) {  
  11.             parent.removeView(rootView);  
  12.         }   
  13.         return rootView;  
  14.     }  
//网上大都是这个说法。切换还是刷新数据,事件不生效

最终解决:看源码的时候发现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的切换状态中的数据,下拉就可以刷新想要刷新的界面的数据了。嗯呢。(*╹▽╹*)

猜你喜欢

转载自blog.csdn.net/nvcxy_1225/article/details/78465804
今日推荐