Adithya
Adithya

Reputation: 183

How to open a specific fragment page in viewpager from another activity button click event

Could any one let me know how to open a specific fragment present in a viewpager from another activities button click event.

I am using a alert dialog which shows two options to select respective screens in viewpager like below but I am getting null pointer on clicking screentwo button which has code to open viewpagers second page.

public class MainActivity extends FragmentActivity {
    int pos;
    ViewPager pager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     
         pager = (ViewPager) findViewById(R.id.viewPager);
        pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
      Button   ds = (Button) findViewById(R.id.show_back);
     ds.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent goIntent = new Intent(MainActivity.this,SecondActivity.class);
            startActivity(goIntent);

        }
     });
    }

    private class MyPagerAdapter extends FragmentPagerAdapter {

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int pos) {
            switch(pos) {

            case 0: return FirstFragment.newInstance("FirstFragment, Instance 1");
            case 1: return SecondFragment.newInstance("SecondFragment, Instance 1");
            default: return FirstFragment.newInstance("FirstFragment, Instance 1");
            }
        }

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

goesBack = (Button) findViewById(R.id.show_front);
goesBack.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(SecondActivity.this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
        alertDialogBuilder.setMessage("Please choose your Favourite Screen");
        alertDialogBuilder.setNegativeButton("ScreenOne",new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            Intent go = new Intent(SecondActivity.this,MainActivity.class);
            startActivity(go);
             }
        });
        alertDialogBuilder.setPositiveButton("ScreenTwo", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                // Create new fragment and transaction
                SecondFragment newFragment = new SecondFragment();
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.container, newFragment, "NewFragment");
                transaction.addToBackStack(null);
                transaction.commit();
             }
        });
        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();         
    }
});

Thanks & Regards,

Aditya.J

Upvotes: 6

Views: 19799

Answers (3)

live-love
live-love

Reputation: 52366

This code will use previous and next buttons to move to previous or next fragments, and it will open up the next activity at the end.

 private int[] layouts;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wizard_setup);

        ViewPager viewPager = findViewById(R.id.view_pager);
        viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));    

        layouts = new int[]{
                R.layout.fragment_1,
                R.layout.fragment_2,
                R.layout.fragment_3};

        Button btn_next = findViewById(R.id.btn_next);
        btn_next.setOnClickListener(v -> {
            int current = viewPager.getCurrentItem() + 1;
            if (current < layouts.length) {
                // move to next screen
                viewPager.setCurrentItem(current);
            } else {
                // open next activity
                Intent intent = new Intent(WizardSetupActivity.this, NextActivity.class);
                startActivity(intent);
                finish();
            }
        });

        Button btn_prev = findViewById(R.id.btn_prev);
        btn_prev.setOnClickListener(v -> {
            int current = viewPager.getCurrentItem() - 1;
            if (current >= 0) {
                // move to previous screen
                viewPager.setCurrentItem(current);
            } 
        });
    }

Upvotes: 0

user5534193
user5534193

Reputation: 145

viewPager.setCurrentItem(THE_POSITION)

Upvotes: 5

Bhargav
Bhargav

Reputation: 8277

In your onClick just pass the position of viewpager you want to show in the intent's extras, and in the viewpager activity just call pager.setCurrentItem(position).

So code would be something like this for your onClick

goesBack = (Button) findViewById(R.id.show_front);
goesBack.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(SecondActivity.this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
        alertDialogBuilder.setMessage("Please choose your Favourite Screen");
        alertDialogBuilder.setNegativeButton("ScreenOne",new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent go = new Intent(SecondActivity.this,MainActivity.class);

                // you pass the position you want the viewpager to show in the extra, 
                // please don't forget to define and initialize the position variable
                // properly
                go.putExtra("viewpager_position", 0)

                startActivity(go);
            }
        });
        alertDialogBuilder.setPositiveButton("ScreenTwo", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                // Create new fragment and transaction

                /*SecondFragment newFragment = new SecondFragment();
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.container, newFragment, "NewFragment");
                transaction.addToBackStack(null);
                transaction.commit();*/
                // You don't do the above code, it will just create a new fragment
                // you do this instead.
                Intent go = new Intent(SecondActivity.this,MainActivity.class);

                // you pass the position you want the viewpager to show in the extra, 
                // please don't forget to define and initialize the position variable
                // properly
                go.putExtra("viewpager_position", 1)

                startActivity(go);
             }
        });
        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();         
    }
});

The code for your viewpager activity would be something like this.

int pos;
ViewPager pager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);     
    int position = 0;
    Bundle extras = getIntent().getExtras();
    if(extras != null) {
        position = extras.getInt("viewpager_position");
    }
    pager = (ViewPager) findViewById(R.id.viewPager);
    MyPagerAdapter myPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
    pager.setAdapter(myPagerAdapter);
    Button   ds = (Button) findViewById(R.id.show_back);
    ds.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        Intent goIntent = new Intent(MainActivity.this,SecondActivity.class);
        startActivity(goIntent);

    }
    });

    pager.setCurrentItem(position) // this way if there is no extras 
    // you will get first position of viewpager
    // otherwise you will get the position of viewpager whichever was passed in the intent.
}

Upvotes: 12

Related Questions