프래그먼트에서 getSupportFragmentManager ()에 어떻게 액세스 할 수 있습니까?


157

FragmentActivity가 있고 그 안에 맵 조각을 사용하고 싶습니다. 지원 조각 관리자에 액세스하는 데 문제가 있습니다.

 if (googleMap == null) {
            googleMap = ((SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map1)).getMap();

            // check if map is created successfully or not
            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),
                        "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                        .show();
            }
        }

            // create marker
            MarkerOptions marker = new MarkerOptions().position(
                    new LatLng(latitude, longitude)).title("Hello Maps ");

            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(latitude, longitude)).zoom(15).build();

            googleMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));

            // adding marker
            googleMap.addMarker(marker);

답변:


278

직접 전화 할 수 있습니다

getFragmentManager() 

조각 관리자를 얻을 수 있습니다.

또는

조각에서

필드 만들기 :

private FragmentActivity myContext;

프래그먼트의 onAttach 메소드를 재정의하십시오.

@Override
public void onAttach(Activity activity) {
    myContext=(FragmentActivity) activity;
    super.onAttach(activity);
}

Support fragment manager call을 받아야 할 경우 :

FragmentManager fragManager = myContext.getSupportFragmentManager(); //If using fragments from support v4

또는

FragmentManager fragManager = myContext.getFragmentManager();

끝났습니다.


3
내가 처음 작동 할 때 클릭하지만 다른 조각으로 다시 진행 한 후에는 이것을 클릭하면 빈 페이지가 표시됩니다.
DjP

11
이것은 오버 헤드입니다. 아래 내 답변을 참조하십시오 ... getFragmentManager ()는 실제로 필요한 전부입니다.
Mark

4
여기서 전역 mContext 변수가 필요하지 않습니다. 코드의 어느 곳에서나 getActivity ()를 사용하십시오. 사람들을 잘못된 방향으로 잘못 안내하지 않도록 답을 수정하십시오.
Varundroid

3
@Varundroid. 언제든지 getFragmentManager ()를 호출 할 수 있다는 사실에 동의합니다. 이메일 ID를 보내 주시면 getActivity ()가 null을 반환 할 가능성이 있음을 증명하기 위해 u 샘플 코드를 보낼 수 있습니다.
Eldhose M Babu

1
@ androidplusios.design 조각 내에서 getSupportFragementManager가 아닌 getFragmentManager ()를 호출해야합니다. getFragmentManager ()는 Fragment 클래스의 인스턴스 함수이므로 u를 Fragment 내에서 호출 할 수 있으며 포함하는 Fragment 클래스의 현재 인스턴스 참조를 가져옵니다.
Eldhose M Babu

83

당신이해야 할 모든 사용

getFragmentManager()

당신의 조각에 방법. 이 프래그먼트를 추가하는 동안 사용했을 때 지원 프래그먼트 관리자를 제공합니다.

조각 문서


8
이것은 정답이어야하며, 첫 번째 답에서 제안한 부모 활동에 대한 참조를 유지하지 않는 것이 좋습니다.
Yoann Hercouet

1
@이 답변은 완벽한 답변이며 허용되는 답변이어야합니다.
Varundroid

3
이것은 android.app.Fragment를 반환합니다. 경우에 따라 android.support.app.v4.Fragment가 필요하므로 항상 작동하지 않습니다.
codingpuss

1
이 문제를 해결하는 방법? support.app.v4.Fragment one이 필요하다고 생각합니다.
Dennis Lukas

5
적절한 FragmentManager가 반환됩니다. android.support.app.v4.Fragment에 있으면 Activity의 getSupportFragmentManager () 메소드와 동일한 것을 반환합니다. 이 경우에 메소드가 단순히 getFragmentManager ()라고 불리는 이유는 Activity의 경우와 달리 모호하지 않기 때문입니다.
blunden

44

간단히 다음과 같이하십시오-

getFragmentManager() // This will also give you the SupportFragmentManager or FragmentManager based on which Fragment class you have extended - android.support.v4.app.Fragment OR android.app.Fragment.

또는

getActivity().getSupportFragmentManager();

Fragment의 onActivityCreated () 메소드와 onActivityCreated () 이후에 호출되는 모든 메소드에서.


Android 개발에 익숙하지 않지만 올바른 방법인지 확실하지 않습니다.
Papipo 2019

@ codecaster 당신은 Fragment 자체의 getFragmentManager () 메소드를 사용하여 FragmentManager를 얻을 수 있습니다. 내 답변을 편집했습니다.
Varundroid

1
getActivity.getSupportFragmentManager () 대신 getFragmentManager ()를 바꿀 때까지 이상한 일을 한 프로젝트가 있습니다.
Papipo

흠. 지금까지 이와 같은 문제가 발생하지 않았지만 위의 해결책 중 어느 것도 나쁘지 않으므로 어떤 것이 든 사용할 수 있습니다.
Varundroid

2
나는 수업을 깊이 들여다 보았다. 이것이 android.support.v4.app.Fragment를 사용하는 최고의 솔루션 인 것 같습니다
DearDhruv

16

Kotlin 사용자는이 답변을 시도

(activity as AppCompatActivity).supportFragmentManager

3
여기에 넣은 좋은 점, 그렇지 않으면 나를 미치게 할 것입니다 Ty
MePo

@ GiedriusŠlikas 조각이나 활동에서 작동하지 않습니까?
Ranjith Kumar

13

이 문제가 있고 API 레벨 21 이상인 경우 다음을 수행하십시오.

   map = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map))
                    .getMap();

이것은 조각 내부에서 사용될 때 맵을 얻습니다.


1
위의 제안 된 코드 수정을 모두 시도했지만 그중 아무것도 작동하지 못했습니다. getChildFragmentManager ()가 트릭을 수행했습니다! 고마워.
John Ward

21 이하의 API 레벨은 어떻습니까? 예를 들어 API 레벨 19?
Aliton Oliveira

6

getActivity().getSupportFragmentManager()언제든지 SupportFragmentManager를 가져 오려면 사용할 수 있습니다.

계층은 활동-> 조각입니다. 프래그먼트는 getSupportFragmentManger를 직접 호출 할 수 없지만 Activity는 할 수 있습니다. 따라서 getActivity를 사용하여 프래그먼트가있는 현재 활동을 호출하고 getgetSupportFragmentManager()


5

부모 활동은 AppCompatActivity를 확장하므로 컨텍스트 대신 Activity 대신 AppCompatActivity로 컨텍스트를 캐스트해야했습니다.

예.

FragmentAddProduct fragmentAddProduct = FragmentAddProduct.newInstance();
FragmentTransaction fragmentTransaction = ((AppCompatActivity)mcontext).getSupportFragmentManager().beginTransaction();

1
((AppCompatActivity) mContext)부분이었다 정확히 내가 무엇을 찾고 있었다. 감사합니다!
17시




3

자바에서는 대체 할 수 있습니다

getChildFragmentManager()

kotlin에서 간단하게

childFragmentManager

그것이 도움이되기를 바랍니다 :)


2

다음 코드는 나를 위해 속임수를 씁니다.

 SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map));
    mapFragment.getMapAsync(this);


1

당신은 간단하게 액세스 할 수 있습니다

Context mContext;

public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

mContext = getActivity();

}

그런 다음 사용

FragmentManager fm = ((FragmentActivity) mContext)
                        .getSupportFragmentManager();

1

Fragment 내에서 supportFragmentManager를 사용하는 일부 Kotlin 코드.

  override fun onCreateView(
      inflater: LayoutInflater,
      container: ViewGroup?,
      savedInstanceState: Bundle?

  ): View? {

    super.onCreateView(inflater, container, savedInstanceState)
    val rootView = inflater.inflate(R.layout.fragment_home, container, false)

    // ....

    if (rootView.home_play_btn != null) {

      rootView.home_play_btn.setOnClickListener {
        val fragment: BaseFragment = ListFragment.newInstance()
        val fragManager: FragmentManager = (activity as AppCompatActivity).supportFragmentManager
        fragManager.beginTransaction()
            .replace(R.id.content_home_frame, fragment, TAG).commit()

      }

0

getSupportFragmentManager() 활동 중이고 조각을 얻으려고 할 때 사용되지만 조각에서는 액세스 할 수 있습니다

getSupportFragmentManager()

다른 방법을 사용 getFragmentMangaer()하면 같은 방식으로 작동하며 다음과 같이 getSupportFragmentManager()사용할 수 있습니다.

fragmentTransaction =getFragmentManager().beginTransaction();

0

kotlin에서하는 새로운 방법

requireActivity().supportFragmentManager

-1

이 시도:

private SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());

귀하의 요구 사항은 무엇입니까, 귀하의 요구 사항은 조각 내부의 조각을 사용하여 다른 호출기 내에 호출기를 정의하는 것입니다 ..! 즉, 스 와이프 가능한 레이아웃 내부에서 레이아웃을 스 와이프해야합니까?
Maddy

1
@VJ가 답변을 확장하도록 요청한 이유는 코드 줄이 좋은 품질의 답변이 아니기 때문입니다. 질문의 원래 질문자 이외의 많은 사람들이 귀하의 답변을보고 자신의 문제를 해결하기 위해 그것을 사용할 수 있습니다. 문제의 원래 문제가 무엇인지, 왜 작동하지 않는지, 왜 솔루션이 작동하는지 설명한 경우 해당 사용자에게 도움이 될 것입니다.
psubsee2003
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.