剛上手一個項目 懶的用viewpager+fragment模式,儘管在後面的項目中仍是用到viewpager+fragment。先說說問題,屢次切換fragment的時候頁面出現空白,剛開始覺得傳遞的參數有問題,可是也確實出現這個問題,手賤致使。緩存
好比根據傳入的tag實例化的時候,錯把第一個數據和第二個傳入相同的數據。copy的錯,死活切換不了,後來debug才搞定:ide
/**
* 初始化 newInstance 管理fragment頁面 同時設置當期fragment頁面
*/
public static BaseFragment newInstance(Context context,String tag){
BaseFragment baseFragment = null;
if(TextUtils.equals(tag, context.getString(R.string.m))){
if(baseFragment==null)
baseFragment = new FragmentA();
}else if(TextUtils.equals(tag, context.getString(R.string.f))){
if(baseFragment==null)
baseFragment = new FragmentB();
}else if(TextUtils.equals(tag, context.getString(R.string.g))){
if(baseFragment==null)
baseFragment = new FragmentC();
}
return baseFragment;
}工具
=================================優化
後來問題表如今,第一個fragment加載數據緩慢 在未加載徹底的時候切換其餘頁面的時候出現空白,在網上找了各類方法 剛開始覺得緩存方面沒作好(確實還沒來得及作緩存那塊的優化),後來看各類帖子,設置在清單文件設至signTask, ...終於意識到fragment狀態沒保存。。。this
只要在onCreateView中加一個判斷就搞定了:debug
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (mView != null) {
ViewGroup parent = (ViewGroup) mView.getParent();
if (parent != null) {
parent.removeView(mView);
}
return mView;
}
View rootView = null;
rootView = inflater.inflate(R.layout.question, container, false);
mView = rootView;
return rootView;
}code
================ 2017/12/18 分割線 ===================orm
無心中看到本身的筆記 如今進行修正 下面的util工具類 rem
public class FragmentUtils { private final HashMap<String, Fragment> fragments = new HashMap<>(); private final FragmentActivity activity; private final FragmentManager manager; private final int container; private String current; public FragmentUtils(FragmentActivity activity, @IdRes int container) { this.activity = activity; this.container = container; this.manager = activity.getSupportFragmentManager(); } /** * one add show * @param fragment */ public void switchTo(Class<? extends Fragment> fragment) { String name = fragment.getName(); if (null != current) { manager.beginTransaction().hide(fragments.get(current)).commit(); } if (null == manager.findFragmentByTag(name)) { Fragment instance = Fragment.instantiate(activity, name); fragments.put(name, instance); manager.beginTransaction().add(container, instance, name).addToBackStack(name).commit(); } else { manager.beginTransaction().show(fragments.get(name)).commit(); } current = name; } @Nullable public Fragment getFragment(Class<? extends Fragment> fragment) { return fragments.get(fragment.getName()); } /** * two replace */ public void openFragment(Fragment fragment){ FragmentTransaction fragmentTransaction = manager .beginTransaction(); fragmentTransaction.replace(container, fragment); fragmentTransaction.commit(); } /** * * 單純添加 用的比較少 * The {@code fragment} is added to the container view with id {@code frameId}. The operation is * performed by the {@code fragmentManager}. */ public void addFragmentToActivity (@NonNull Fragment f) { Fragment fragment = checkNotNull(f); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(container, fragment); transaction.commit(); }}