Fragment - 2

Chance·2023년 1월 27일

Fragment의 NewInstance호출

  • newInstance호출은 프래그먼트 재사용에 필요한 호출방법
  • newInstance는 결국 빈 생성자를 호출함으로 newInstance없이 빈생성자만 호출해도 코드상 문제는 없음
  • API28부터는 선택형으로 바뀜.

commit vs commitNow

  • 동기화가 필요하지만 트랜잭션을 백스택에 추가하지 않는 경우
    commitNow()
  • 여러 트랜잭션을 수행중이거나, 동기화가 필요하지 않거나, 백스택에 추가하는 경우
    commit()
  • 지정된 시간까지 트랜잭션 집합이 수행되도록 하려면
    executePendingTransactions()

Activity -> Fragment 데이터 전송
1. Bundle
Activity

FragmentTransaction ft = fragmentManager.beginTransaction();

            Bundle bundle = new Bundle();
            bundle.putString("initStep-2" , "Bundle Value");
            audioPlay_fragment.setArguments(bundle);

            ft.replace(R.id.fragment_container, audioPlay_fragment);
            ft.commitNow();

Fragment

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WMLog.d(TAG , "### audioFragment call");

        Bundle bundle = this.getArguments();
        if(getArguments() != null) {
            String result = bundle.getString("initStep-2");
            WMLog.d("TAG" , "### result : " + result);
        }
        else
            WMLog.d(TAG, "getArgument() : NULL");

    }
  • 가끔 bundle로 값을 넘겼을 때 null값이 들어가는 경우가 있는데 2가지 이유로 추측할 수 있다.
  1. setArguement보다 fragment가 먼저 호출된 경우
    • Activity의 onCreate에서 fragment를 호출하고 뒤늦게 setArguemt를 하는 경우
    • fragment의 onCreate보다 당연히 Activity의 라이프사이클이 먼저 불리고 먼저 불린 사이클에서 setArguemt가 호출된 후 fragment의 라이프사이클이 불러야 한다.
  2. key값이 틀렸을 경우

Activity에서 Fragment 띄우기

        // act에서 frag를 관리하기 위한 manager 생성
        fragmentManager = (FragmentManager) getSupportFragmentManager();

        // 커스텀 fragment생성
        Fragment ctfragment = fragmentManager.findFragmentById(R.id.fragment_container);

        if (ctfragment == null) {
            // frag를 동적으로 생성, 제거, 교체하기 위한 fragment transaction
            FragmentTransaction ft = fragmentManager.beginTransaction();

            ft.replace(R.id.fragment_container , imageChoice_fragment);
            ft.commit();
            // commit = transactin이 비동기적으로 실행된다
            // commitNow = 현재 transaction이 백스택에 추가되어 있지 않을 때만 사용할 수 있다.
        }

0개의 댓글