안드로이드 화면을 Activity가 아닌 Fragment로 구성할 때에는 별도로 뒤로가기 처리를 해줘야한다.
즉, 프래그먼트 A -> B-> C 로 이동했을 때에, Back Key를 눌렀을 때 C->B->A 로 돌아갈 수 있도록 해줘야한다. 그렇지 않으면 바로 앱이 종료되기 때문이다.
구글링해서 나온 여러 코드들은 리스너 interface를 구현해서 사용하는데, 이해가 잘되지 않아 Stack을 이용해 쉽게 구현하는 방법을 사용했다.
예제는 세 개의 프래그먼트를 만들어놓고, 버튼을 누르면 First -> Second -> Third 프래그먼트로 이동할 수 있도록 했고, Back Key를 누르면 직전 프래그먼트로 이동할 수 있도록 하였다.
먼저 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() 메소드에 넣어준다.
다음 프래그먼트로 이동하는 버튼을 누를 때, 프래그먼트 replace 전에 현 프래그먼트를 스택에 저장해준다.
프래그먼트 이동은 MainActivity에 changeFragment() 라는 메소드를 별도로 정의해 이용하였다.
현재 프래그먼트를 가져오는 코드는 아래와 같다.
Fragment currentFragment = MainActivity.manager.findFragmentById(R.id.container);
id container는 프래그먼트를 넣어주는 프레임레이아웃 id이다.
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Fragment currentFragment = MainActivity.manager.findFragmentById(R.id.container);
// 이동버튼 클릭할 때 stack에 push
MainActivity.fragmentStack.push(currentFragment);
MainActivity.changeFragment(MainActivity.FRAGMENT_SECOND);
}
});
뒤로가기를 누를 때 스택이 비어있지 않다면 마지막 원소를 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;
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;
}
}
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( LayoutInflater inflater, final ViewGroup container, 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() {
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 |
---|