어떻게 설정할 수 있습니다 Fragment
이야 ‘ Id
내가 사용할 수 있도록 getSupportFragmentManager().findFragmentById(R.id.--)
?
답변
프로그래밍 방식으로 조각의 ID를 설정할 수 없습니다 .
그러나 String tag
Fragment를 고유하게 식별하는 데 사용할 수있는 FragmentTransaction 내부에 설정할 수있는 것이 있습니다.
Aleksey가 지적했듯이 ID를 FragmentTransaction
의 add(int, Fragment)
메서드에 전달할 수 있습니다 . 그러나 이것은 조각의 ID를 지정하지 않습니다. ViewGroup
삽입 할 의 ID를 지정합니다 Fragment
. 이것은 Fragment
s가 아니라 ViewGroup
s를 고유하게 식별하기 때문에 내가 기대하는 목적에 그다지 유용하지 않습니다 . 이러한 ID는 하나 이상의 조각을 동적으로 추가 할 수있는 컨테이너 입니다 . 이러한 방법을 사용하여를 식별 하려면 삽입 할 때마다 레이아웃에를 동적으로 추가해야합니다 . 꽤 번거 롭습니다.Fragment
ViewGroup
Fragment
따라서 질문이 동적으로 추가하는 Fragment에 대한 고유 식별자를 만드는 방법 인 경우 대답은 FragmentTransaction
의 add (int containerViewId, Fragment fragment, String tag) 메서드 및 FragmentManager
의 findFragmentByTag (String) 메서드를 사용하는 것입니다.
내 앱 중 하나에서 문자열을 동적으로 생성해야했습니다. 그러나 어쨌든 실제 FragmentTransaction에 비해 그렇게 비싸지 않습니다.
태그 메소드의 또 다른 장점은 UI에 추가되지 않는 프래그먼트를 식별 할 수 있다는 것입니다. FragmentTransaction의 add (Fragment, String) 메서드를 참조하십시오 . Fragment
s는 필요 없습니다 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 메서드 외에도 조각 태그를 지원합니다.