剛上手一個項目 懶的用viewpager+fragment模式,盡管在后面的項目中還是用到viewpager+fragment。先說說問題,多次切換fragment的時候頁面出現空白,剛開始以為傳遞的參數有問題,但是也確實出現這個問題,手賤導致。
比如根據傳入的tag實例化的時候,錯把第一個數據和第二個傳入相同的數據。copy的錯,死活切換不了,后來debug才搞定:
/**
* 初始化 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狀態沒保存。。。
只要在onCreateView中加一個判斷就搞定了:
@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;
}
================ 2017/12/18 分割線 ===================
無意中看到自己的筆記 現在進行修正 下面的util工具類
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();
}
}