안드로이드 FragmentActivity 전환

조회수 1391회

안드로이드 앱을 만들고 있습니다.

조금 진행을 하다보니 A화면이 처음에 보여도 B화면이 이미 onCreate를 수행한 상태이고 싶습니다.

왜냐면 B에서 구글맵을 띄워 그림을 그려줄 것이기 때문입니다.

여러 조언을 받고, FragmentActivity를 사용해 보니 하나의 FragmentActivity에 처음부터 2개의 fragment를 붙여 둘다 onCraate 되는 모습을 보았습니다.

(단, A B 두개의 Fragment를 만들었어도 A Fragment가 FragmentActivity를 모두 차지합니다.)

   <fragment
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        class="com.example.googlemap_test.leftFragment"
        android:id="@+id/leftView"/>
    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.example.googlemap_test.rightFragment"
        android:id="@+id/rightView"/>

이러한 xml코드로 두개의 Fragment 를 붙였습니다.

하지만 이런 식으로 한다면, left fragment에서 rigth fragment로 화면을 변경하고 싶을 때 Main에서 객체로 생성되지 않았기 때문에 replace를 사용하는데 어려움이 있습니다.

이런 상황을 접하니, 처음부터 잘못된 선택을 한 것이 아닌가 싶습니다.

혹시 해결할 수 있는 방법이나, 다른 방법으로 할 수 있는지 궁금합니다. 조언 부탁드립니다.

※잘못 알고 있는 부분이 있다면 알려주세요!

  • "left fragment에서 rigth fragment로 화면을 변경하고 싶을 때 Main에서 객체로 생성되지 않았기 때문에" 가 정확히 무슨 의미인가요? 알 수 없는 사용자 2018.7.24 10:09
  • Fragment 를 전환할 때 " replace의 매개변수는 (프래그먼트를 담을 영역 id, 프래그먼트 객체) "라는 것을 보고 직접 코딩도 해보았습니다. replace에서 프래그먼트 객체를 필요로 하지만 위 코드는 객체를 생성하지 않고 MainActivity에서 class~~ 이부분을 통하여 바로 화면을 띄워 주는 것 같습니다. 그래서 left, right 객체를 생성하여 화면에 보여주지 않아도 생명주기를 수행하였습니다. 하지만 new 클레스명이름(); 으로 객체를 담아놓은 곳이 없으니 화면 전환에서 애먹고 있습니다. 심승현 2018.7.24 13:22
  • 내부적으로 Fragment 객체는 생성 됩니다. 명시적으로 직접 객체를 생성해서 사용하는 방식이 아닐 뿐이죠. xml 에 선언한 fragment 객체를 갖고오는 방법이 궁금하신 거라면 fragmentManager 의 findFragmentById() 혹은 findFragmentByTag() 를 통해 가져 올 수 있습니다. 알 수 없는 사용자 2018.7.24 13:48
  • 아! 맞아요! 간지러운 곳을 긁어주신 기분입니다! 정말 감사합니다. :) 심승현 2018.7.24 14:04

1 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    FragmentTransaction 클래스의 replace() 함수는 본질적으로 기존 프래그먼트를 remove(Fragment)한 뒤, 새로운 프래그먼트를 add(int, Fragment, String)하는 것과 같습니다. 작성한 코드의 의도는 left, right 프래그먼트를 미리 로드해두기 위함인데, 설명한 것처럼 프래그먼트 간 이동을 위해 replace()를 사용한다면 right -> left로 이동할 때 right 프래그먼트는 종료 루틴을 타게됩니다. 이렇게 되면 다시 right로 이동할 때, 프래그먼트를 새로 생성 후 액티비티에 추가하겠다는 의미가 되므로 의도(=preload)와 맞지 않을 가능성이 높습니다.

    그리고 (테스트를 해보셨다면 아시겠지만) XML을 통해 이미 액티비티에 추가된 프래그먼트의 인스턴스를 이용한 add()와 replace()는 동작하지 않습니다. (이미 해당 인스턴스의 프래그먼트가 액티비티에 추가된 상태이기 때문에 의도한대로 화면 전환이 일어나지 않을거에요)

    지금 코드에서 큰 변경없이 작업하는 방법은 show(Fragment) / hide(Fragmet)가 아닐까 싶고요. 아래 코드를 참고하셔서 상태 변경 시 프래그먼트의 노출을 제어해보세요.

    supportFragmentManager.beginTransaction()
        .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
        .show(rightFragmeht)
        .commit()
    
    supportFragmentManager.beginTransaction()
        .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
        .hide(leftFragment)
        .commit()
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 정말 감사합니다 :) 설명해주신대로 replace를 하면 오류가 나오고, 계속해서 Destroy를 하기 때문에 다시 만드는 꼴이 되었습니다. 설명해주신대로 add를 통하여 Fragment를 붙여 show,hide로 제어하니 onCreate를 한번만 걸칠 수 있었습니다! 심승현 2018.7.24 20:53

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)