MosesA
MosesA

Reputation: 965

ViewPager - Launch Activity from setOnTabSelectedListener

I'm trying to get an activity to launch when a specific tab is selected but when I return from that activity, I want the previous to show instead of the tab I clicked. Just like when you click the plus button on Instagram.

Like this:

Right now, I'm storing the last visited tab index in a variable, then when Tab 3 is clicked, it just goes to the last visited tab.

tabLayout.setOnTabSelectedListener(
            new TabLayout.ViewPagerOnTabSelectedListener(viewPager) {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                  //super.onTabSelected(tab); -- Should keep this or leave it commented out? 
                    int pos = tab.getPosition();
                    switch (pos) {
                        case 0:
                            viewPager.setCurrentItem(tab.getPosition(), false);
                            getSupportActionBar().setTitle("Home");
                            pre_pos = pos;
                            pre_title = "Home";
                            break;
                        case 1:
                            viewPager.setCurrentItem(tab.getPosition(), false);
                            getSupportActionBar().setTitle("Trending");
                            pre_pos = pos;
                            pre_title = "Trending";
                            break;
                        case 2:
                            viewPager.setCurrentItem(pre_pos, false);
                            getSupportActionBar().setTitle(pre_title);

                            Intent intent = new Intent(MainActivity.this, NewEvent_Activity.class);
                            startActivity(intent);
                            Toast.makeText(getApplicationContext(), 
                                    "Curr: "+ viewPager.getCurrentItem()+
                                    " Prev: " + pre_pos +
                                    " Clicked: " +tab.getPosition(), 
                                    Toast.LENGTH_SHORT).show();
                            break;
                        case 3:
                            viewPager.setCurrentItem(tab.getPosition(), false);
                            getSupportActionBar().setTitle("Notifications");
                            pre_pos = pos;
                            pre_title = "Notifications";
                            break;
                        case 4:
                            viewPager.setCurrentItem(tab.getPosition(), false);
                            getSupportActionBar().setTitle("Profile");
                            pre_pos = pos;
                            pre_title = "Profile";
                            break;
                    }
                }
            });

In ViwPager.java it calls this function when setCurrentItem() is called

void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
    if (mAdapter == null || mAdapter.getCount() <= 0) {
        setScrollingCacheEnabled(false);
        return;
    }
    //I think my problem lies in the following line (mCurItem == item)
    if (!always && mCurItem == item && mItems.size() != 0) {
        setScrollingCacheEnabled(false);
        return;
    }

    if (item < 0) {
        item = 0;
    } else if (item >= mAdapter.getCount()) {
        item = mAdapter.getCount() - 1;
    }
    final int pageLimit = mOffscreenPageLimit;
    if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
        // We are doing a jump by more than one page.  To avoid
        // glitches, we want to keep all current pages in the view
        // until the scroll ends.
        for (int i = 0; i < mItems.size(); i++) {
            mItems.get(i).scrolling = true;
        }
    }
    final boolean dispatchSelected = mCurItem != item;

    if (mFirstLayout) {
        // We don't have any idea how big we are yet and shouldn't have any pages either.
        // Just set things up and let the pending layout handle things.
        mCurItem = item;
        if (dispatchSelected) {
            dispatchOnPageSelected(item);
        }
        requestLayout();
    } else {
        populate(item);
        scrollToItem(item, smoothScroll, velocity, dispatchSelected);
    }
}

I think this is where my problem is but I can't edit it. Any suggestions?

Thanks.

Upvotes: 1

Views: 286

Answers (2)

Aniruddh Parihar
Aniruddh Parihar

Reputation: 3104

To do this You have to follow these Simple Steps

Step : 1 Override below method in all ViewPager Frgment

 @Override
    public void setMenuVisibility(boolean menuVisible) {
        super.setMenuVisibility(menuVisible);
    }

this method will be called when your fragment become visible.

step : 2 Put a condition in Fragmenr3 to start new Activity when your Fragment become visible

@Override
        public void setMenuVisibility(boolean menuVisible) {
            super.setMenuVisibility(menuVisible);
            if(menuVisible){
Intent intent = new Intent(MainActivity.this, NewEvent_Activity.class);
                            startActivity(intent);
          }
        }

Now it will open you activity in front. but your one requirement remaining which is, if user press back from activity, you have to show second Last fragment, so as you have mention you are storing index position of Last fragment so follow below step .

Step : 3 Override onRestart() in Your ViewPager Actvity

@Override
    protected void onRestart() {
        super.onRestart();
        view_pager.setCurrentItem(Stored last Index);
    }

it will solve your problem, its working for me.

Upvotes: 1

Firoz Jaroli
Firoz Jaroli

Reputation: 505

implement ViewPager.OnPageChangeListener on activity. set listner on viewpager

 view_pager.setOnPageChangeListener(this);

in OnPageSelected() method:

@Override
public void onPageSelected(int position) {
    if (position == 3) {
        startActivity(new Intent(this,activity.class));
    }
}

override activity onResume method and write:

@Override
public void onResume() {
    super.onResume();
   view_pager.setCurrentItem(0);
}

Upvotes: 1

Related Questions