selfstarter

Android fragment 정리 본문

App/Android

Android fragment 정리

selfstarter 2020. 6. 4. 16:31

fragment add, replace

add는 activity에 기존 fragment는 놔두고 추가하는 것. onDetch를 호출하지 않을 때도 있다고 한다. 그리고 같은 fragment를 add할 시 에러 발생
replace는 기존 fragment를 변경하는 것. add, remove를 같이 쓰는게 번거로워 보여 간편하게 replace 사용

fragment backstack

현재 실행하려는 트랙잭션의 상태를 기억한다. 스마트폰의 back key를 통해 프래그먼트를 이전 상태로 되돌릴 수 있다
만약 activity가 하나이고 fragment만 이동하는 구조라면 스마트폰 back key 설정을 하지 않으면 앱을 나가버린다
replace 다음에 addToBackStack 함수만 호출하면 된다

public void changeFragment (Fragment fragment) {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction.replace(R.id.fragment, fragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

Fragment 화면전환 애니메이션

  • 속성 애니메이션 사용. 속성 애니메이션은 거의 모든 항목을 애니메이션으로 만들 수 있다.
  • 시간에 따라 객체의 속성을 변화시킬 수 있음

애니메이션 정의

  • res/anim 폴더 안에 애니메이션을 정의하는 xml을 생성한다
  • objectAnimator android:propertyName : 해당 속성의 이름을 의미. null이면 안된다
  • objectAnimator android:duration : 해당 애니메이션의 길이. milliseconds
  • objectAnimator android:valueFrom : 애니메이션 전 properyName에 해당하는 속성의 값을 설정
  • objectAnimator android:valueTo : 애니메이션 후 properyName에 해당하는 속성의 값을 설정
  • objectAnimator android:valueType : value data type
  • translate android:fromXDelta : X의 시작 위치
  • translate android:toXDelta : X의 끝나는 위치
  • translate android:fromYDelta : Y의 시작 위치
  • translate android:toYDelta : Y의 끝나는 위치
  • translate android:duration : 애니메이션 시간
  • start_left : 왼쪽에서 fragment view가 보임
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
      android:propertyName="x"
      android:duration="1000"
      android:valueFrom="-1080dp"
      android:valueTo="0"
      android:valueType="floatType" />
    </set>
  • start_right : 오른쪽에서 fragment view가 보임
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
      android:propertyName="x"
      android:duration="1000"
      android:valueFrom="1080dp"
      android:valueTo="0"
      android:valueType="floatType" />
    </set>
  • end_left : 왼쪽으로 fragment view가 이동하며 사라짐
    <set xmlns:android="http://schemas.android.com/apk/res/android">
      <objectAnimator
          android:propertyName="x"
          android:duration="1000"
          android:valueFrom="0"
          android:valueTo="-1080dp"
          android:valueType="floatType" />
    </set>
  • end_right : 오른쪽으로 fragment view가 이동하며 사라짐
    <set xmlns:android="http://schemas.android.com/apk/res/android">
      <objectAnimator
          android:propertyName="x"
          android:duration="1000"
          android:valueFrom="0"
          android:valueTo="1080dp"
          android:valueType="floatType" />
    </set>
  • fade_in : 화면이 점점 나타남
    <set xmlns:android="http://schemas.android.com/apk/res/android">
      <objectAnimator
          android:duration="1000"
          android:propertyName="alpha"
          android:valueFrom="0"
          android:valueTo="1"
          android:valueType="floatType"
          />
    </set>
  • fade_in : 화면이 점점 사라짐
    <set xmlns:android="http://schemas.android.com/apk/res/android">
      <objectAnimator
          android:duration="1000"
          android:propertyName="alpha"
          android:valueFrom="1"
          android:valueTo="0"
          android:valueType="floatType"
          />
    </set>
  • translate의 fromXDelta, fromYDelta 등 속성도 사용 가능
    <set xmlns:android="http://schemas.android.com/apk/res/android"
      android:shareInterpolator="false">
      <translate
          android:fromXDelta="0%"
          android:toXDelta="100%"
          android:fromYDelta="0%"
          android:toYDelta="0%"
          android:duration="1000" />
    </set>

Fragment 화면 전환

  • fragmentTransaction에서 setCustomAnimations 함수 호출
  • back은 휴대폰에서 back key를 눌렀을 때다. toolbar에 이전화면 되돌아가기 icon 선택 시 replace로 화면을 교체하므로 1,2번째 인자에 해당하는 애니메이션이 실행된다(back ani실행 x)
  • setCustomAnimations 함수에 인자를 두개만 전달하면 화면 전환 ani만 설정, back ani는 지정하지 않는다

fragmentTransaction.setCustomAnimations(
@AnimatorRes @AnimRes int enter
, @AnimatorRes @AnimRes int exit
, @AnimatorRes @AnimRes int popEnter
, @AnimatorRes @AnimRes int popExit)
enter : 화면 이동 시 새로 들어오는 fragment ani
exit : 화면 이동 시 기존 fragment ani
popEnter : back할 때 새로 들어오는 fragment ani
popExit : back할 때 기존에 있던 fragment ani

public void changeFragment (Fragment fragment) {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction.setCustomAnimations(R.anim.start_left, R.anim.end_right, R.anim.start_left, R.anim.end_right);
    fragmentTransaction.setCustomAnimations(R.anim.start_left, R.anim.end_right);
    fragmentTransaction.replace(R.id.fragment, fragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}
Comments