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的切换状态中的数据,下拉就可以刷新想要刷新的界面的数据了。嗯呢。(*╹▽╹*)