FragmentPagerAdapter加載fragment並使用setUserVisibleHint()處理預加載時遇到的坑,給textview賦值時出現的空指針異常


FragmentPagerAdapter加載fragment並使用setUserVisibleHint()處理預加載時,給textview賦值時出現的空指針異常

public class BaseFragment extends Fragment {
    /*布局*/
    private View view;
    /**/
    boolean isVisible = false;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = setRootView(inflater,container);
        Log.i("包名:"+getClass().getName(),"onCreateView");
        return view;

    }
    protected View setRootView(LayoutInflater inflater, @Nullable ViewGroup container){
        return null;
    }
    protected void initWidght(){};
    protected void initData(){};
    /**
     * 解決預加載
     * */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        Log.i("包名:"+getClass().getName()," setUserVisibleHint  顯示"+getUserVisibleHint());
        if (getUserVisibleHint()){
            onVisible();
            isVisible = true;
        }else {
//            onInvisible();
        }
    }
    /**
     *  預加載--顯示-加載數據
     * */
    private void onVisible() {
        if (!isVisible){
            initWidght();
        }
    }
    /**
     * 預加載--不顯示時
     * */
    private void onInvisible() {
        isVisible = false;
    }
    protected <T extends View>T getView(int resourcesId){
        return (T) view.findViewById(resourcesId);
    }
    /**
     * Toast提示;
     * @param content 提示內容;
     */
    protected void showToast(String content) {
        Toast.makeText(getActivity(), content, Toast.LENGTH_SHORT).show();
    }
}
public class IndexChatFragment extends BaseFragment {
    TextView mTextView;
    @Override
    protected View setRootView(LayoutInflater inflater, @Nullable ViewGroup container) {
        return inflater.inflate(R.layout.fragment_index_chat,container,false);
    }

    @Override
    protected void initWidght() {
        mTextView = getView(R.id.ceshi);
        mTextView.setText("賦值測試");
    }

出現了這個錯誤

 

測試發現具體問題是:只有加載的第一個Fragment會出現這種狀況,后邊則可以正常顯示

最后打印了生命周期才發現是這樣的,setUserVisibleHint是比oncreateView先加載,所以第一個調用setUserVisibleHint時是空

 

onCreateView和setUserVisibleHint都調用onvisible(),兩個條件同事滿足則加載布局或者數據

view也可以單獨換成一個標記,在oncreateView里賦值true

 


免責聲明!

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



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