activity+fragment多次切換出現頁面空白問題


剛上手一個項目 懶的用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();
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM