简体   繁体   中英

Why is null in ViewPager method?

I have ViewPager. Every ViewPager's page is customView. In custom view class in addOnPageChangeListener(new ViewPager.OnPageChangeListener() method I get null. I can't understand why, because in other method with viewPager - setOnClickListener(new OnClickListener() there are no null. This method works.

my custom view:

public class CustomView extends LinearLayout {
    private LayoutInflater mInflater;
    private Button button;
    private ViewPager viewPager;
    
    public void setPager(ViewPager viewPager) {
       this.viewPager = viewPager;
    }
    public CustomView(@NonNull Context context) {
        super(context);
    }

    public CustomView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mInflater = LayoutInflater.from(context);

        View v = mInflater.inflate(R.layout.custom_view, this, true);
        button = v.findViewById(R.id.nextButton);

        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true);
            }
        });
        
        
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

and activity class:

public class Activity extends AppCompatActivity {
    private ViewPager viewPager;
    private CustomPagerAdapter customPagerAdapter;
    private CustomView customView;
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        customPagerAdapter = new CustomPagerAdapter(this);
        viewPager = findViewById(R.id.viewPager);
        customView = findViewById(R.id.customView);

        viewPager.setAdapter(customPagerAdapter);
        customView.setPager(viewPager);
    }
}

and I get error:

E/AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.viewpager.widget.ViewPager.addOnPageChangeListener(androidx.viewpager.widget.ViewPager$OnPageChangeListener)' on a null object reference
        at CustomView.<init>(line : viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener())

You are calling the addOnPageChangeListener in constructor of the CustomView, and the viewpager is not set in your view yet. Try to call addOnPageChangeListener in your setPager method.

public class CustomView extends LinearLayout {
private LayoutInflater mInflater;
private Button button;
private ViewPager viewPager;

public void setPager(ViewPager viewPager) {
   this.viewPager = viewPager;
   viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

}

public CustomView(@NonNull Context context) {
    super(context);
}

public CustomView(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    mInflater = LayoutInflater.from(context);

    View v = mInflater.inflate(R.layout.custom_view, this, true);
    button = v.findViewById(R.id.nextButton);

    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true);
        }
    });
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM