首页 > 解决方案 > 当 ViewPager 到达第 4 页时,我想让一个按钮可见,但我得到空指针异常

问题描述

我偶然发现的一件事是,当我将代码放在 postDelayed 处理程序中时,它可以正常工作。如果没有 postDelayed 处理程序,我怎样才能使它工作?

public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        final SlideFragment fragment = new SlideFragment();
        if (position == 3){

            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    fragment.btnStart.setVisibility(View.VISIBLE);
                }
            },0);
        }
        return fragment;
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }

}

标签: javaandroidandroid-layoutandroid-fragmentsandroid-viewpager

解决方案


问题是您的视图可能无法按时创建,以便您调用它们的 setVisibility。理想情况下,您会在创建片段时传递一个参数,并从它们对片段进行操作。

if (position == 3){
    final SlideFragment fragment = new SlideFragment();
    Bundle bundle = new Bundle();
    bundle.putBoolean("BUTTON_VISIBILITY", true);
    fragment.setArguments(bundle);
}

然后在你的片段中:

public View onCreateView(LayoutInflater inflater,
         ViewGroup containerObject,
         Bundle savedInstanceState){
         //here is your arguments
         Bundle bundle= getArguments(); 

        View view =  inflater.inflate(R.layout.your_fragment_layout, container, false);
        btnStart = view.findViewById(R.id.id_of_your_button);
        if(bundle!=null){
           if(bundle.getBoolean("BUTTON_VISIBILITY", false)){
              btnStart.setVisibility(View.VISIBLE);
           } 
        }
     return view;
     }

编辑

您可以使用 onViewCreated 来确保所有内容都已创建:

   public View onCreateView(LayoutInflater inflater, ViewGroup containerObject, Bundle savedInstanceState){
                return  inflater.inflate(R.layout.your_fragment_layout, container, false); 
             }

   public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Bundle bundle= getArguments(); 
        btnStart = view.findViewById(R.id.id_of_your_button);
            if(bundle!=null){
               if(bundle.getBoolean("BUTTON_VISIBILITY", false)){
                  btnStart.setVisibility(View.VISIBLE);
               } 
            }
    }

推荐阅读