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时是空

自己挖的坑自己填...

纯属自己作,希望能有老司机指点其他解决方法

时间: 2024-10-25 14:23:03

FragmentPagerAdapter加载fragment并使用setUserVisibleHint()处理预加载时遇到的坑,给textview赋值时出现的空指针异常的相关文章

ViewPager和Fragment的综合使用的预加载机制

混合使用的适配器: FragmentPagerAdapter   FragmentStatePagerAdapter(Fragment数据动态性较大.占用内存较多的时候) ViewPager的预加载:ViewPager 会默认预先初始化当前页面的左右相邻页面,它的预先加载页面数量默认是 1 , 并且是private的不可以修改,这样做的好处是左右滑动会比较流畅. 懒加载:即让ViewPager预加载初始化UI,而具体一些数据,网络访问请求等延迟加载.这是靠Fragment里有一个 setUser

Android 加载gif图片强大框架(支持预加载、缓存,还支持显示静态图片,一行代码全搞定)

之前项目中没有涉及到显示gif图片的功能,也没有着重研究过,最近项目中要用到显示gif图片,于是就在网上一顿搜,用过之后发现如下几个缺点. 1.加载大的gif图片会出现oom. 2.没有预加载和缓存功能,比较消耗内存. 3.功能比较单一,显示gif了但是不能显示静态图片. 最后无意间发现了一个强大的gif加载框架,能够满足上面的所有缺陷,支持预加载和缓存,同时支持显示静态图片和gif图片.下面是一些源代码: //xml布局就是一个ImageView //在需要的地方直接调用 Glide.with

android Viewpager取消预加载及Fragment方法的学习

1.在使用ViewPager嵌套Fragment的时候,由于VIewPager的几个Adapter的设置来说,都会有一定的预加载.通过设置setOffscreenPageLimit(int number) 来设置预加载的熟练,在V4包中,默认的预加载是1,即使你设置为0,也是不起作用的,设置的只能是大于1才会有效果的.我们需要通过更改V4包中的默认属性才可以. 更改过的V4 包下载地址: 2.限制预加载,会出现滑动过程中卡顿现象.其实Fragment中防止预加载主要是防止数据的预加载,Fragm

android 禁止viewpager预加载

ViewPager这个控件相信每一个做android的都用过,而且一定用过,viewpager是可以前后滑动的,这在很多app中引导页中用过,大家也知道它是带缓存的,现在新建一个项目 viewpagertest, package com.example.viewpagertest; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.os.IBinder

js图片预加载

打开网页时,最慢最耗时的就是加载图片.而根据图片大小的不同,加载的时间也不一样.这是就会出现图片一部分加载呈现出来而另一部分还是空白的情况.从整体的体验来讲,这使得用户体验大大的降低了. 而图片的预加载能很好的解决这一问题. 这时,一般都会用到js里边的Image对象.function preLoadImg(url) { var img = new Image(); img.src = url;} window.onload=function (){ var oDiv=document.getE

封装的图片预加载,数据加载到浏览器底部加载数据

html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="jquery-1.8.3.min.js" type="text/javascript"></script> <style> *{ padding:0; margin:0

懒加载和预加载

参考链接: 懒加载和预加载 懒加载的原理及实现 处理图片预加载时设置img的src属性和img的onload事件的位置前后顺序关系 关于图片的预加载,你所不知道的 页面中的img元素,如果没有src属性,浏览器就不会发出请求去下载图片,只有通过javascript设置了图片路径,浏览器才会发送请求. 加载图片的过程是异步的 一.懒加载 介绍 懒加载也就是延迟加载. 当访问一个页面的时候,先把所有img标签的src设为同一张空白图片的路径(占位图,只需请求一次),将其真正的图片地址存储在img标签

基于用户行为的图片等资源预加载

一.图片的懒加载和预加载 懒加载和本文要提到的预加载实际是不同的概念. 典型的懒加载,例如本博文章的图片,当用户滚动图片进入窗体的时候,才去加载:或者用户点击选项卡,原本隐藏的图片此时再去加载,这个也称之为懒加载. 而预加载则是,用户还没有行为发生,资源已经加载完毕,从这一定义来讲,我们传统图片啪啪啪全部加载完毕,本质上也是预加载,好处就在于,体验好啊,没有泛白或者菊花的出现.不足也很明显,那就是资源可能白白加载了,尤其视频之类的,小明打开bilibili就是来围观广告的,结果,百兆视频巴拉拉魔

JS图片预加载插件

在开发H5项目中有时候会遇到要加载大量图片的情况,利用预加载技术可以提高用户浏览时的体验. 1)概念:懒加载也叫延迟加载:JS图片延迟加载,延迟加载图片或符合某些条件时才加载某些图片.预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染. 2)区别:两种技术的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载.懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力. 服务器端区别:懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数.预加载可以说是牺牲