1.fragment的切换
以前做项目时,fragment切换总是用replace方法,这样对性能影响很大,所以换一种方式用hide和show方法进行展示。
首先定义一个全局的currentFragment
“`
private Fragment currentFragment = new Fragment();
private FragmentTransaction switchFragment(Fragment targetFragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if(!targetFragment.isAdded()){
if(currentFragment != null){
transaction.hide(currentFragment);
}
transaction.add(R.id.ll_main,targetFragment,targetFragment.getClass().getName());
}else{
transaction.hide(currentFragment).show(targetFragment);
}
currentFragment = targetFragment;
return transaction;
}
“
然后再在切换button上直接调用即可
switchFragment(oneFg).commit();
如果想要刷新数据的话,可以利用fragment的隐藏方法:
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(hidden){ //隐藏
}else{ //显示
}
}
2.fragment重叠
hide和show容易出现fragment重叠现象
解决方法:
通过重写 宿主activity的onSaveInstanceState 方法,然后不保存状态
@Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
}
3.getActivity为空
解决方法:
Activity activity;
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = (Activity) context;
}
4.fragment嵌套
fragment嵌套经常出现崩溃
解决方法:
宿主fragment 使用getChildFragmentManager();
在宿主fragment中:
@Override
public void onDetach() {
super.onDetach();
try {
//参数是固定写法
Field childFragmentManager = Fragment.class.getDeclaredField(“mChildFragmentManager”);
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}