Fragment的常用及易错知识

390 阅读1分钟

首页tab与Fragment的使用

原理:拿到事务之后进行操作,常见的有hide,show,add,remove等
代码:

    private void replaceFragment(Fragment fragment){
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.fl_layout,fragment);
    }
    private void hideAndShowFragment(Fragment from,Fragment to){
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        if(!to.isAdded()){
            transaction.hide(from).add(R.id.fl_layout,to).commit();
        }else{
            transaction.hide(from).show(to).commit();
        }

    }

commit和commitAllowingStateLoss区别:

commitAllowingStateLoss类似Commit,但是允许Activity状态被保存了之后调用,也就是说activity调用了onSaveInatanceState()之后再调用Commit的话会抛出异常,但是使用CommitAllowingStateLoss就不会

Fragmnt的懒加载的实现

//判断对用户是否可见:
public abstract class BaseLazyFragment extends Fragment  {
    protected boolean isViewInitiated;
    protected boolean isVisibleToUser;
    protected boolean isDataInitiated;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        isViewInitiated = true;
        prepareFetchData();
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        this.isVisibleToUser = isVisibleToUser;
        prepareFetchData();
        isHindToUser(isVisibleToUser);
    }

    public abstract void fetchData();
    public boolean prepareFetchData() {
        return prepareFetchData(false);
    }

    public boolean prepareFetchData(boolean forceUpdate) {
        if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
            fetchData();
            isDataInitiated = true;
            return true;
        }
        return false;
    }

    /**
     * 对用户隐藏的时候,让子类复写去实现自己的逻辑
     * @param isHind
     */
    public void isHindToUser(boolean isHind){
    }

    /**
     * 当页面显示的时候,让子类复写去实现自己的逻辑,通常用在父Fragment向子Fragment进行通信
     */
    public void showDoSomeThing(Object object){
    }
    public boolean isShowToUser(){
        return this.isVisibleToUser;
    }
}

推荐

Fragmentation github.com/YoKeyword/F…