본문 바로가기
Android

ViewPager Back Button 처리

by 들풀민들레 2018. 1. 31.

 

수업시간에 질문 받았던 내용을 테스트 했던 것을 올린다.

 

 

 

두말할것도 없이 ViewPager와 TabLayout 조합의 화면이 많이 작성이 된다.

그런데 Back Button 에 의해 Activity가 종료되는 것이 아니라 ViewPager의 이전 화면이 나오게 처리하고 싶은 경우가 있다. 

물론 ViewPager만 이용했다면 화면이 순차적으로 이동하니까 Back Button에 의한 이전 화면이 나오게 하는 알고리즘은 의외로 간단할것 같다. 

현 페이지의 index 값에서 1을 빼서 보여주면 되니까..

그런데 ViewPager와 TabLayout이 결합이 되면 화면이 항상 순차적으로 이동하는 것이 아님으로 Back Button에 의한 이전 화면 처리는 이전 화면의 위치에 대한 정보를 유지해야 한다.

 

이를 간단하게 처리하기 위한 API가 제공되는지는 모르겠으나 Stack 알고리즘으로 쉽게 해결할수 있지 않을까 싶다.

 

    

 

 

구글링해 보면 다 나오는 이야기지만 질문도 들어왔고 테스트 해본게 있어 포스팅 해본다.

 

Stack 변수를 하나 선언하고 ViewPager 화면 전환 위치를 Stack에 저장해 주었다가 Back Button 이벤트시 Stack에 저장된 화면 정보를 추출하여 보여주면 되는 단순한 알고르즘이다.

 

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {

 

    ViewPager viewPager;

    Stack<Integer> pageStack;

    boolean isBack = false;

 

    int prePageIndex;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

 

        pageStack = new Stack<Integer>();

 

        viewPager = (ViewPager) findViewById(R.id.viewpager);

        viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));

        viewPager.addOnPageChangeListener(this);

 

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

        tabLayout.setupWithViewPager(viewPager);

    }

 

    class MyPagerAdapter extends FragmentStatePagerAdapter {

 

        List<Fragment> fragments = new ArrayList<Fragment>();

        private String titles[] = new String[]{"TAB1", "TAB2", "TAB3"};

 

        public MyPagerAdapter(FragmentManager fm) {

            super(fm);

            fragments.add(new OneFragment());

            fragments.add(new TwoFragment());

            fragments.add(new ThreeFragment());

        }

 

        @Override

        public Fragment getItem(int position) {

            return this.fragments.get(position);

        }

 

        @Override

        public int getCount() {

            return this.fragments.size();

        }

 

        @Override

        public CharSequence getPageTitle(int position) {

            return titles[position];

        }

    }

 

    @Override

    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

 

    }

 

    @Override

    public void onPageSelected(int position) {

        if (!isBack) {

            pageStack.push(Integer.valueOf(prePageIndex));

        }

        prePageIndex = position;

    }

 

    @Override

    public void onPageScrollStateChanged(int state) {

 

    }

 

    @Override

    public void onBackPressed() {

        if (pageStack.empty()) {

            super.onBackPressed();

        } else {

            isBack = true;

            int index = pageStack.pop().intValue();

            viewPager.setCurrentItem(index);

            isBack = false;

        }

    }

}