Как закрыть viewAdapter кнопкой на последнем изображении? - PullRequest
1 голос
/ 06 мая 2020

то, что я пытаюсь сделать, это закрыть адаптер изображения одним нажатием кнопки, расположенной в третьем представлении.

Я устанавливаю представления, следуя этому руководству, и он отлично работает: *

Теперь я пытаюсь закрыть адаптер с помощью кнопки в последнем представлении. Я получаю сообщение об ошибке, указывающее на кнопку: Попытка вызвать виртуальный метод void android .widget.Button.setOnClickListener (android .view.View $ OnClickListener) 'для ссылки на нулевой объект

Я думаю, это потому, что кнопка находится не на основном макете, а на макете представления. так как я могу правильно получить к нему доступ, чтобы скрыть / закрыть адаптер

это основной

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView3 = findViewById(R.id.textView3);

        textView3.setVisibility(View.INVISIBLE);

        btnClose=findViewById(R.id.btnClose);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new CustomPagerAdapter(this));
        viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                viewPager.setVisibility(View.INVISIBLE);
                textView3.setVisibility(View.VISIBLE);
            }
        });

    }

Это адаптер

public class CustomPagerAdapter extends PagerAdapter {

    private Context mContext;

    public CustomPagerAdapter(Context context) {
        mContext = context;
    }

    @Override
    public Object instantiateItem(ViewGroup collection, int position) {
        ModelObject modelObject = ModelObject.values()[position];
        LayoutInflater inflater = LayoutInflater.from(mContext);
        ViewGroup layout = (ViewGroup) inflater.inflate(modelObject.getLayoutResId(), collection, false);
        collection.addView(layout);
        return layout;
    }

    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        collection.removeView((View) view);
    }

    @Override
    public int getCount() {
        return ModelObject.values().length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        ModelObject customPagerEnum = ModelObject.values()[position];
        return mContext.getString(customPagerEnum.getTitleResId());
    }

}

Это объект модели class

public enum ModelObject {

    RED(R.string.red, R.layout.view_red),
    BLUE(R.string.blue, R.layout.view_blue),
    GREEN(R.string.green, R.layout.view_green);

    private int mTitleResId;
    private int mLayoutResId;

    ModelObject(int titleResId, int layoutResId) {
        mTitleResId = titleResId;
        mLayoutResId = layoutResId;
    }

    public int getTitleResId() {
        return mTitleResId;
    }

    public int getLayoutResId() {
        return mLayoutResId;
    }

}

Чтобы узнать, как это работает, я хочу скрыть адаптер и показать текстовое представление. Опять же, я думаю, проблема в том, что кнопка находится на другом макете, так как я могу это назвать?

1 Ответ

1 голос
/ 06 мая 2020

Реализуйте свой слушатель в основном классе и передайте его в viewpager. Прикрепите слушателя по запросу, только просмотр обзора.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textView3 = findViewById(R.id.textView3);

    textView3.setVisibility(View.INVISIBLE);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            viewPager.setVisibility(View.INVISIBLE);
            textView3.setVisibility(View.VISIBLE);
        }
    }
    viewPager.setAdapter(new CustomPagerAdapter(this), listener);
    viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
}

public class CustomPagerAdapter extends PagerAdapter {

    private Context mContext;
    private View.OnClickListener mListener;

    public CustomPagerAdapter(Context context, View.OnClickListener listener) {
        mContext = context;
        mListener = listener;
    }

    @Override
    public Object instantiateItem(ViewGroup collection, int position) {
        ModelObject modelObject = ModelObject.values()[position];
        LayoutInflater inflater = LayoutInflater.from(mContext);
        ViewGroup layout = (ViewGroup) inflater.inflate(modelObject.getLayoutResId(), collection, false);
        collection.addView(layout);

        if (position == 2) {
            View btnClose = layout.findViewById(R.id.btnClose);
            btnClose.setOnClickListener(mListener);
        }
        return layout;
    }

    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        collection.removeView((View) view);
    }

    @Override
    public int getCount() {
        return ModelObject.values().length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        ModelObject customPagerEnum = ModelObject.values()[position];
        return mContext.getString(customPagerEnum.getTitleResId());
    }
}
...