Search code examples
androidandroid-fragmentsandroid-viewpagerandroid-tablayout

Backtrace for inner fragments


May be question title is common but the problem is not. I am using one Activity in which frame layout i am replacing the fragment with FragmentTransaction and FragmentManager . this is done successfully i got new fragment let say Fragment A. Now in Fragment A i have viewpager with three tabs and each tab have fragment so in Fragment A i have Fragment B,Fragment C and Fragment D.

Whole scenario Activity-> replacing framelayout -> Fragment A-> three tabs (three fragments Fragment B,Fragment C and Fragment D)

Now the Problem :

When i am in second tab if i back press then i move to activity directly. I want to make if in second or third tab then move to previous tabs and if in first tab then move to activity page.

May be in fragment backtrace is automatically maintaned but if used in Activity then only. right now i am using fragment to hold the tabs.

What i tried :

I have created listener :

PageChangeListener :

public interface PageChangeListener {
    public void onNextRequest();
    public void onPrivousRequest();
}

Implemented this in Fragment A :

 @Override
    public void onNextRequest() {
        if(mViewPagerPage + 1 < mPageCount)
        {
            viewPager.setCurrentItem(++mViewPagerPage,true);
        }
    }

    @Override
    public void onPrivousRequest() {

        if(mViewPagerPage -1 >= 0)
        {
            viewPager.setCurrentItem(--mViewPagerPage,true);
        }

    }

But in this Problem is : where to use onPrivousRequest() method as fragments don't have onBackPressed Method.

Any help will be appreciated.


Solution

  • where to use onPrivousRequest() method as fragments don't have onBackPressed Method.

    There is way to do so:

    Step1: Create and interface

    public interface OnFragmentBackPressed {
        boolean onBackPressed();
    }
    

    Step 2: Implement it in your Fragment

    public class TabFragment extends Fragment implements OnFragmentBackPressed {
    
       @Override
       public boolean onBackPressed() {
           if (Condition: Check if you have to move on other tabs) {
                return true; 
            } else {
                return false;
            }
        }
    }
    

    Step 3: In your Activity override onBackPressed()

    public class FragmentContainerActivity extends AppCompatActivity {
    
        @Override 
        public void onBackPressed() {
        Fragment mF = getSupportFragmentManager().findFragmentById(R.id.main_container);
           if (!(mF instanceof OnFragmentBackPressed) || !((OnFragmentBackPressed) mF).onBackPressed()) {
              super.onBackPressed(); // This won't get called unless you return false in Fragment's onBackPressed();
           }
        }
    }