[android] Android-조각 ID 설정

어떻게 설정할 수 있습니다 Fragment이야 ‘ Id내가 사용할 수 있도록 getSupportFragmentManager().findFragmentById(R.id.--)?



답변

프로그래밍 방식으로 조각의 ID를 설정할 수 없습니다 .

그러나 String tagFragment를 고유하게 식별하는 데 사용할 수있는 FragmentTransaction 내부에 설정할 수있는 것이 있습니다.

Aleksey가 지적했듯이 ID를 FragmentTransactionadd(int, Fragment)메서드에 전달할 수 있습니다 . 그러나 이것은 조각의 ID를 지정하지 않습니다. ViewGroup삽입 할 의 ID를 지정합니다 Fragment. 이것은 Fragments가 아니라 ViewGroups를 고유하게 식별하기 때문에 내가 기대하는 목적에 그다지 유용하지 않습니다 . 이러한 ID는 하나 이상의 조각을 동적으로 추가 할 수있는 컨테이너 입니다 . 이러한 방법을 사용하여를 식별 하려면 삽입 할 때마다 레이아웃에를 동적으로 추가해야합니다 . 꽤 번거 롭습니다.FragmentViewGroupFragment

따라서 질문이 동적으로 추가하는 Fragment에 대한 고유 식별자를 만드는 방법 인 경우 대답은 FragmentTransactionadd (int containerViewId, Fragment fragment, String tag) 메서드 및 FragmentManagerfindFragmentByTag (String) 메서드를 사용하는 것입니다.

내 앱 중 하나에서 문자열을 동적으로 생성해야했습니다. 그러나 어쨌든 실제 FragmentTransaction에 비해 그렇게 비싸지 않습니다.

태그 메소드의 또 다른 장점은 UI에 추가되지 않는 프래그먼트를 식별 할 수 있다는 것입니다. FragmentTransaction의 add (Fragment, String) 메서드를 참조하십시오 . Fragments는 필요 없습니다 View! 또한 구성 변경 사이에 임시 상태를 유지하는 데 사용할 수도 있습니다!


답변

조각 ID를 알 필요가 없을 수도 있습니다.

문서에서 :

public abstract Fragment findFragmentById (int id)

Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.

중요한 부분은 “트랜잭션에 추가 될 때 컨테이너 ID로”입니다.

그래서:

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.fragment_holder, new AwesomeFragment())
    .commit();

그리고

AwesomeFragment awesome = (AwesomeFragment)
     getSupportFragmentManager()
          .findFragmentById(R.id.fragment_holder);

R.id.fragment_holder에있는 (멋진) 조각이 무엇이든 얻을 수 있습니다.


답변

대부분의 경우 조각 태그와 ID를 사용할 수 있습니다.
에서 태그 값을 설정할 수 있습니다 FragmentTransaction.add(Fragment fragment, String tag );. 그런 다음 명령 FragmentManager.findFragmentByTag(String tab)을 사용하여 문제의 조각을 찾을 수 있습니다 .


답변

Tom과 다른 사람들이 이미 언급했듯이 조각에 태그를 삽입하고 해당 태그를 식별에 사용하는 방법이 있습니다. 이러한 솔루션을 통해 알게 된 후속 문제는 프래그먼트가 액티비티와 연결될 때까지 태그를 얻지 못한다는 것입니다.FragmentManager 입니다. 태그가 지정되기 전에 조각을 식별해야하는 경우 어떻게해야합니까?

지금까지 내 솔루션은 모두 세계에서 가장 오래된 (Java) 트릭에 의존합니다. 생성자 중 하나에서 ID를 가져와 제공하는 최소한의 템플릿 조각을 만듭니다. getFragmentId() 를 반환 메서드를 . 그런 다음 조기 식별이 필요한 조각이 해당 템플릿을 확장하도록합니다. 짜잔! 문제 해결됨.

이 솔루션의 힘은, 불행하게도, 템플릿 조각, 각 조각 유형에 대한 하나의 세트 필요 ListFragment, DialogFragment또는 오래된 일반 Fragment조기 발견이 필요합니다 (POFO를?!). 그러나 이것은 제공된 이득을 고려할 때 내가 생각하는 단편의 경우 관리 할 수 ​​있습니다.

상처를 찢어서 미안 해요 🙂

건배!


답변

다음을 사용하십시오.

조각을 추가하려면 :

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();

기존 조각을 식별하려면 :

getFragmentManager().findFragmentByTag(fragmentName);


답변

태그를 사용할 때

fragmentTransaction.addToBackStack(null); 

개발자 가이드에 언급 된대로 조각이 파괴되는 대신 재개되도록 메서드를 사용합니다.

프래그먼트를 제거하는 트랜잭션을 수행 할 때 addToBackStack ()을 호출하지 않으면 트랜잭션이 커밋 될 때 해당 프래그먼트가 파괴되고 사용자가 다시 탐색 할 수 없습니다. 반면에 조각을 제거 할 때 addToBackStack ()을 호출하면 조각이 중지되고 나중에 사용자가 다시 탐색하면 다시 시작됩니다.

이 페이지 끝에서 찾을 수 있습니다 .

간단한 findFragmentByTag();호출을 통해 내 Fragment를 찾을 수없는 이유를 파악하는 데 약 30 분이 걸렸습니다.


답변

Tom의 답변 외에도 replace 메서드는 add 메서드 외에도 조각 태그를 지원합니다.