-
[Android/Java] 프래그먼트(Fragment)Android/Java 2022. 4. 3. 14:41반응형
[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]
<프래그먼트 사용 목적>
- 분할된 화면들을 독립적으로 구성하기 위해
- 분할된 화면들의 상태를 관리하기 위해
- 액티비티가 길어지는 경우 여러 부분으로 나눠서 관리하기 쉽게 하기 위해
*프래그먼트는 항상 id 지정해 줘야 함*
*프래그먼트는 항상 액티비티 위에 올라가 있어야 함*
-> 프래그먼트가 제대로 동작하는 시점은 프래그먼트가 메모리에 만들어진 시점이 아닌 액티비티에 올라가는 시점
*안드로이드에서 발생하고 있는 Fragment 오류(안드로이드 버그로 추정)*
-> 프래그먼트 전환 시 이전 화면이 지워지지 않고 남아 있는 문제가 생겨서 당분간 Fragment 대신 FrameLayout 사용
-> xml에서 Fragment만 FrameLayout으로 변경해주면 됨
*replace 하는 경우 주의할 점*
-> 레이아웃 크기가 서로 동일해야 replace 가능
<프래그먼트간 값 전달>
- Bundle 사용
- 데이터를 보내는 쪽
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); search Search = new search();//데이터 받는 fragment String id = "abc"; Bundle bundle = new Bundle(); bundle.putString("id",id); Search.setArguments(bundle); ft.replace(R.layout.fragment_search,Search).commit();
- 데이터를 받는 쪽
Bundle bundle = getArguments(); String id = bundle.getString("id");
<프래그먼트 -> 액티비티 전환 >
Intent intent = new Intent(getContext(), MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
- 위 코드는 액티비티로 전환된 후 기기의 뒤로가기 버튼 누른 경우 이전 프래그먼트로 돌아가지 않게 하기 위해 intent에 flag를 추가한 것
- flag를 추가하지 않으면 뒤로가기 버튼 누른 경우 이전 프래그먼트로 돌아감
<뒤로가기 버튼 누른 경우 이전 프래그먼트로 돌아가기>
ft.replace(R.id.fragment_search, Search).addToBackStack(null).commit();
- replace() 뒤에 addToBackStack() 추가
- 액티비티 위에 액티비티를 쌓는 것은 불가능하지만 액티비티 위에 여러 개의 프래그먼트를 겹치는 것은 가능
- addToBackStack()을 사용하는 이유
- 최상단 프래그먼트를 제거하려면 remove() 함수를 사용
- 이 때, 뒤로가기 버튼 눌러서 remove() 하려면?
- 뒤로 가기 누른 경우 호출되는 메서드인 onBackPressed() 안에 remove()를 사용하면 된다고 생각하겠지만 프래그먼트는 onBackPressed() 함수를 제공하지 않음
- 위와 같은 경우에 사용할 수 있도록 구글이 addToBackStack() 메서드를 제공함
- addToBackStack() 없이 replace() 하는 경우
- 기존에 존재하던 프래그먼트는 버려짐(Destroy)
- addToBackStack() 사용하여 replace() 하는 경우
- 기존에 존재하던 프래그먼트들이 버려지는 것이 아니라 BackStack에 들어가 일시 정지 상태(Pause)로 유지됨
- addToBackStack()은 commit() 전에 호출해야 함
[계속 추가 예정]
반응형'Android > Java' 카테고리의 다른 글
[Android/Java] 리싸이클러뷰(RecyclerView) (0) 2022.05.17 [Android/Java] 액티비티 생명주기 (0) 2022.05.16 [Android/Java] 스레드(Thread)와 핸들러(Handler) (0) 2022.03.18 [Android/Java] 다이얼로그(Dialog)+커스텀 다이얼로그(Custom Dialog) (0) 2022.03.12 [Android/Java] SharedPreferences(간단한 데이터 저장) (0) 2022.02.27