수업시간에 질문 받았던 내용을 테스트 했던 것을 올린다.
두말할것도 없이 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;
}
}
}
'Android' 카테고리의 다른 글
Android 12 변경사항 - API 관점 (2) | 2021.12.01 |
---|---|
Android Architecture Component + Coroutine + Hilt + Clean Architecture 교육 (0) | 2021.09.30 |
FusedLocationProviderClient (0) | 2018.01.30 |
[깡샘의 안드로이드 프로그래밍] 정리 32- MediaPlayer (0) | 2018.01.06 |
[깡샘의 안드로이드 프로그래밍] 정리 31 - Collection Type 의 App Widget (0) | 2018.01.06 |