Android 为什么ViewPager方法中为null?

Android 为什么ViewPager方法中为null?,android,android-viewpager,android-inflate,Android,Android Viewpager,Android Inflate,我有寻呼机。每个ViewPager的页面都是customView。在addOnPageChangeListener(new ViewPager.OnPageChangeListener()方法中的自定义视图类中,我得到了null。我不明白为什么,因为在另一个使用ViewPager-setOnClickListener(new OnClickListener()的方法中没有null。此方法有效 我的自定义视图: public class CustomView extends LinearLayou

我有寻呼机。每个ViewPager的页面都是customView。在
addOnPageChangeListener(new ViewPager.OnPageChangeListener()
方法中的自定义视图类中,我得到了null。我不明白为什么,因为在另一个使用ViewPager-
setOnClickListener(new OnClickListener()
的方法中没有null。此方法有效

我的自定义视图:

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) {

            }
        });
活动类别:

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);
    }
}
我得到一个错误:

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())
E/AndroidRuntime:由以下原因引起:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void androidx.viewpager.widget.viewpager.addOnPageChangeListener(androidx.viewpager.widget.viewpager$OnPageChangeListener)”
在CustomView。(行:viewPager.addOnPageChangeListener(新建viewPager.OnPageChangeListener())

您正在CustomView的构造函数中调用
addOnPageChangeListener
,但视图中尚未设置viewpager。请尝试在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);
        }
    });
}