프래그먼트 뒤로가기

안드로이드 화면을 Activity가 아닌 Fragment로 구성할 때에는 별도로 뒤로가기 처리를 해줘야한다.

즉, 프래그먼트 A -> B-> C 로 이동했을 때에, Back Key를 눌렀을 때 C->B->A 로 돌아갈 수 있도록 해줘야한다. 그렇지 않으면 바로 앱이 종료되기 때문이다.

구글링해서 나온 여러 코드들은 리스너 interface를 구현해서 사용하는데, 이해가 잘되지 않아 Stack을 이용해 쉽게 구현하는 방법을 사용했다.

예제는 세 개의 프래그먼트를 만들어놓고, 버튼을 누르면 First -> Second -> Third 프래그먼트로 이동할 수 있도록 했고, Back Key를 누르면 직전 프래그먼트로 이동할 수 있도록 하였다.

  1. 먼저 Fragment 스택을 만들어 놓고, 기본적으로 들어갈 프래그먼트를 push해준다.

    public static Stack<Fragment> fragmentStack;

    firstFragment = new FirstFragment();
    secondFragment = new SecondFragment();
    thirdFragment = new ThirdFragment();

    fragmentStack = new Stack<>();
    fragmentStack.push(firstFragment);
    manager = getSupportFragmentManager();
    manager.beginTransaction().replace(R.id.container, firstFragment).commit();
    • 위의 코드는 MainActivity 의 onCreate() 메소드에 넣어준다.

  2. 다음 프래그먼트로 이동하는 버튼을 누를 때, 프래그먼트 replace 전에 현 프래그먼트를 스택에 저장해준다.

    • 프래그먼트 이동은 MainActivity에 changeFragment() 라는 메소드를 별도로 정의해 이용하였다.

    • 현재 프래그먼트를 가져오는 코드는 아래와 같다.

      Fragment currentFragment = MainActivity.manager.findFragmentById(R.id.container);

      • id container는 프래그먼트를 넣어주는 프레임레이아웃 id이다.

    • button.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             Fragment currentFragment = MainActivity.manager.findFragmentById(R.id.container);

             // 이동버튼 클릭할 때 stack에 push
             MainActivity.fragmentStack.push(currentFragment);
             MainActivity.changeFragment(MainActivity.FRAGMENT_SECOND);
        }
      });
  3. 뒤로가기를 누를 때 스택이 비어있지 않다면 마지막 원소를 pop 하여 해당 프래그먼트로 이동한다.

  • 전체소스코드

    1) MainActivity.java

    public class MainActivity extends AppCompatActivity {

       final static int FRAGMENT_FIRST = 1001;
       final static int FRAGMENT_SECOND = 1002;
       final static int FRAGMENT_THIRD = 1003;

       public static FirstFragment firstFragment;
       public static SecondFragment secondFragment;
       public static ThirdFragment thirdFragment;
       public static FragmentManager manager;

       public static Stack<Fragment> fragmentStack;

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

           firstFragment = new FirstFragment();
           secondFragment = new SecondFragment();
           thirdFragment = new ThirdFragment();

           fragmentStack = new Stack<>();
           fragmentStack.push(firstFragment);
           manager = getSupportFragmentManager();
           manager.beginTransaction().replace(R.id.container, firstFragment).commit();

      }

       public static void changeFragment(int index){
           switch (index){
               case FRAGMENT_FIRST:
                   manager.beginTransaction().replace(R.id.container, firstFragment).commit();
                   break;
               case FRAGMENT_SECOND:
                   manager.beginTransaction().replace(R.id.container, secondFragment).commit();
                   break;
               case FRAGMENT_THIRD:
                   manager.beginTransaction().add(R.id.container, thirdFragment).commit();
                   break;
          }
      }

       @Override
       public void onBackPressed() {
           if(!fragmentStack.isEmpty()){
               Fragment nextFragment = fragmentStack.pop();
               manager.beginTransaction().replace(R.id.container, nextFragment).commit();
               System.out.println("[TESTING >>] " + fragmentStack.size());
          }else {
               super.onBackPressed();
          }

      }
    }

2) FirstFragment.java

public class FirstFragment extends Fragment {

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {
       ViewGroup rootView = (ViewGroup)inflater.inflate(R.layout.fragment_first, container, false);
       button = rootView.findViewById(R.id.btn_first);
       button.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               Fragment currentFragment = MainActivity.manager.findFragmentById(R.id.container);

               // 이동버튼 클릭할 때 stack에 push
               MainActivity.fragmentStack.push(currentFragment);
               MainActivity.changeFragment(MainActivity.FRAGMENT_SECOND);
          }
      });

       return rootView;
  }

}
  • Second / Third 프래그먼트도 위와 동일하다.


'Android' 카테고리의 다른 글

[Android Error] String resource ID #0x0  (0) 2018.12.07

위와같은 에러를 자주봤는데, 이는 String 값을 인자로 줘야하는데 int와 같은 자료형을 인자로 전달할 때에 발생하는 에러다.


예를 들어

Toast.makeText(getContext(), businessList.size(), Toast.LENGTH_LONG).show();

위와 같이 입력하면 Stirng이 들어가야할 자리에 businessList.size()라는 int 값이 들어가기 때문에 오류가 발생한다.


Toast.makeText(getContext(), businessList.size()+"", Toast.LENGTH_LONG).show();

이와같이 "" 를 붙여 자동으로 String 으로 형변환되도록 해야한다.

'Android' 카테고리의 다른 글

[Android] Stack을 이용한 프래그먼트 뒤로가기  (1) 2018.12.09

+ Recent posts