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