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

剛上手一個項目 懶的用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();  }}
相關文章
相關標籤/搜索