简体   繁体   English

为什么在 ViewPager 方法中为 null?

[英]Why is null in ViewPager method?

I have ViewPager.我有 ViewPager。 Every ViewPager's page is customView.每个 ViewPager 的页面都是 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.addOnPageChangeListener(new ViewPager.OnPageChangeListener()方法中的自定义视图类中,我得到 null。我不明白为什么,因为在带有 viewPager 的其他方法中 - setOnClickListener(new OnClickListener()没有 null。这个方法有效。

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.您正在addOnPageChangeListener的构造函数中调用 addOnPageChangeListener,并且 viewpager 尚未在您的视图中设置。 Try to call addOnPageChangeListener in your setPager method.尝试在 setPager 方法中调用addOnPageChangeListener

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);
        }
    });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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