Search code examples
androidandroid-viewpagerfindviewbyid

how to get access to mybutton in one of viewpager pages?


I'm new to this android and java.

My viewpager now can slide all my xml layout, but i don't know how to access item in them.

I tried using Button mybutton = (Button) findViewById (R.layout.result), then set the onClickListener in mybutton, but then it was forced to close every time I run it.

Here is my code:

public class main extends Activity {

private ViewPager myviewpager;
private ViewPagerAdapter myviewpageradapter;
private static int NUM_AWESOME_VIEWS = 12;
Button button_1;



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    myviewpageradapter = new ViewPagerAdapter();
    myviewpager = (ViewPager) findViewById(R.id.myviewpager);
    myviewpager.setAdapter(myviewpageradapter);

        button_1 = (Button) myviewpager.findViewById(R.id.first_button);
        button_1.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                finish();
            }
        });
}

private class ViewPagerAdapter extends PagerAdapter {

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

    @Override
    public Object instantiateItem(View collection, int position) {
            LayoutInflater layoutinflater = getLayoutInflater();

            View view;
            view = layoutinflater.inflate(R.layout.page1, null);

            switch (position)
            {
                case 0 : view = layoutinflater.inflate(R.layout.page1, null); break;
                case 1 : view = layoutinflater.inflate(R.layout.page2, null); break;
                case 2 : view = layoutinflater.inflate(R.layout.page3, null); break;
                case 3 : view = layoutinflater.inflate(R.layout.page4, null); break;
                case 4 : view = layoutinflater.inflate(R.layout.page5, null); break;
                case 5 : view = layoutinflater.inflate(R.layout.page6, null); break;
                case 6 : view = layoutinflater.inflate(R.layout.page7, null); break;
                case 7 : view = layoutinflater.inflate(R.layout.page8, null); break;
                case 8 : view = layoutinflater.inflate(R.layout.page9, null); break;
                case 9 : view = layoutinflater.inflate(R.layout.page10, null); break;
                case 10 : view = layoutinflater.inflate(R.layout.page11, null); break;
                case 11 : view = layoutinflater.inflate(R.layout.result, null);break;
            }
            ((ViewPager) collection).addView(view,0);
            return view;
    }

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



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

    @Override
    public void finishUpdate(View arg0) {}


    @Override
    public void restoreState(Parcelable arg0, ClassLoader arg1) {}

    @Override
    public Parcelable saveState() {
            return null;
    }

    @Override
    public void startUpdate(View arg0) {}

}

Solution

  • You cannot just use findViewById like that with a ViewPager my friend.

    Since you're inflating different views in the adapter, android cannot find that Button you're referring because it doesn't know which xml layout holds it.

    you can do something like this..

    private ViewPager myviewpager;
    private ViewPagerAdapter myviewpageradapter;
    private static int NUM_AWESOME_VIEWS = 12;
    Button button_1;
    
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        myviewpageradapter = new ViewPagerAdapter();
        myviewpager = (ViewPager) findViewById(R.id.myviewpager);
        myviewpager.setAdapter(myviewpageradapter);
    
    
    }
    
    private class ViewPagerAdapter extends PagerAdapter {
    
        @Override
        public int getCount() {
            return NUM_AWESOME_VIEWS;
        }
    
        @Override
        public Object instantiateItem(View collection, int position) {
            LayoutInflater layoutinflater = getLayoutInflater();
    
            View view = null;
    
            switch (position) {
                case 0:
                    view = layoutinflater.inflate(R.layout.page1, null);
                    Button bb = (Button) view.findViewById(R.id.first_button);
                    bb.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            Toast.makeText(MainActivity.this, "clicked button in first item", Toast.LENGTH_SHORT).show();
                        }
                    });
                    break;
                case 1:
                    view = layoutinflater.inflate(R.layout.page2, null);
                    break;
                case 2:
                    view = layoutinflater.inflate(R.layout.page3, null);
                    break;
                case 3:
                    view = layoutinflater.inflate(R.layout.page4, null);
                    break;
    
            }
            ((ViewPager) collection).addView(view);
            return view;
        }
    
        @Override
        public void destroyItem(View collection, int position, Object view) {
            ((ViewPager) collection).removeView((View) view);
        }
    
    
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == ((View) object);
        }
    

    just like that you can find items in those different xml layout files individually, of course you can dive deeper and look for even better solutions but the way you did it would result in ANR. give it try...