ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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() 전에 호출해야 함

     

    [계속 추가 예정]

     

    반응형

    댓글

Designed by Tistory.