본문 바로가기
안드로이드

[Android] TabViewPager 실행 오류 해결

by Banlim 2020. 8. 6.

[삽질의 기록]

 

Android로 개발하다보면, TabLayout을 사용하여 UI를 구현해야하는 경우가 발생한다.

약 1년 전 개발한 프로젝트에서 Fragment 안에 TabLayout과 TabViewPager를 배치하여 구현해야하는 일이 생겼다.

이 때 TabViewPager에서 임의의 탭을 클릭했을 때, 지정한 Fragment가 나타나는데, 이를 TabViewPagerAdapter.java 파일의 getItem(int position) 이라는 함수를 override하여 이를 구현할 수 있다.

 

[TabViewPagerAdapter.java]

@Override
    public Fragment getItem(int position) {
        switch (position)
        {
            case 0:
                recentFragment = new SendTabRecentFragment();
                return recentFragment;
            case 1:
                // photo
            case 2:
                // video
            case 3:
                // file
            default:
                    return null;
        }
    }

각 case마다 Fragment를 생성하고 생성한 fragment를 리턴하는 코드이다.

이 때 나의 경우, 위 코드처럼 처음에 등장하는 페이지를 0번 탭에서 나오는 페이지로 설정하고, 단순히 테스트를 위해서 "case 0:"에 대해서 생성한 fragment를 리턴하고 그 외의 1,2,3번 case에 대해선 따로 리턴을 하지 않았다.

약 1년 전에 발생한 에러라 정확히는 기억이 나지 않으나, 해당 앱이 제대로 실행되지 않고 종료되는 현상이 발생하였다.

구글링을 통해 이런 저런 방법을 동원하였으나 성공하지 못했었다.

 

결론적으로 해결은 했으나, 이 때 대단한 삽질을 했다.

나의 경우 tabLayout의 각 탭을 java에 동적으로 구현하지 않고, xml에 직접 코드를 작성하였다.

따라서 탭의 개수는 정해져있었고, 이 프로젝트에선 탭의 개수가 4개였다.

임의의 탭을 누를 때 각 탭을 누를 때마다 해당 fragment가 나타나도록 getItem에 각 fragment를 지정해주어야하는데, 이 때 아래 코드 처럼 각 case마다 fragment를 미리 작성을 해야하는 것이었다.

이런 식으로 각 frament 별로 (내용이 비어있어도 좋으니) .java 파일을 생성하고 getItem에 각각 지정해줌으로써 실행이 제대로 되지 않고 종료되는 현상을 해결할 수 있었다.

 

[TabViewPagerAdapter.java]

@Override
    public Fragment getItem(int position) {
        switch (position)
        {
            case 0:
                recentFragment = new SendTabRecentFragment();
                return recentFragment;
            case 1:
                photoFragment = new SendTabPhotoFragment();
                return photoFragment;
            case 2:
                videoFragment = new SendTabVideoFragment();
                return videoFragment;
            case 3:
                fileFragment = new SendTabFileFragment();
                return fileFragment;
            default:
                    return null;
        }
    }

[SendTabRecentFragment.java]

public class SendTabRecentFragment extends Fragment {

    private RecyclerView recentRecyclerview;
    private RecyclerView.LayoutManager layoutManager;

}

[SendTabPhotoFragment.java]

public class SendTabPhotoFragment extends Fragment {

}

[SendTabVideoFragment.java]

public class SendTabVideoFragment extends Fragment {

}

[SendTabFileFragment.java]

public class SendTabFileFragment extends Fragment {

}