フラグメントで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);
}

サポートフラグメントマネージャーの呼び出しを取得する必要がある場合:

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

または

FragmentManager fragManager = myContext.getFragmentManager();

完了です。


3
私が最初にクリックしたとき、それは動作しますが、いくつかの他のフラグメントに行くことを再度、私はこれをクリックすること、それは空白のページを表示した後に...
DJP

11
これはオーバーヘッドです。以下の私の答えを参照してください... getFragmentManager()が本当に必要なすべてです。
マーク・

4
ここではグローバルmContext変数は必要ありません。コード内で必要な場所でgetActivity()を使用してください。間違った方向に人々を誤解しないように、回答を編集してください。
Varundroid、2014

3
@Varundroid。いつでもgetFragmentManager()を呼び出すことができるということに同意します。メールIDを送っていただければ、uにサンプルコードを送信して、地球上でgetActivity()がnullを返す可能性があることを証明できます。
Eldhose M Babu 2014

1
@ androidplusios.designフラグメント内のgetSupportFragementManagerではなく、getFragmentManager()を呼び出す必要があります。getFragmentManager()はFragmentクラスのインスタンス関数であるため、Fragment内で呼び出すことができ、含まれているFragmentクラスの現在のインスタンス参照を取得します。
Eldhose M Babu 2015

83

あなたがする必要があるすべては使用しています

getFragmentManager()

フラグメントのメソッド。このフラグメントを追加するときに使用すると、サポートフラグメントマネージャーが提供されます。

フラグメントのドキュメント


8
これは受け入れられる回答である必要があります。最初の回答で提案されているように、親アクティビティへの参照を保持することはお勧めしません。
Yoann Hercouet 2014年

1
@マークこれは完璧な答えであり、受け入れられた答えになるはずです。
Varundroid、

3
これはandroid.app.Fragmentを返します。場合によっては、android.support.app.v4.Fragmentが必要になるため、常に機能するとは限りません。
codepuss 2015年

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();

フラグメントのonActivityCreated()メソッドと、onActivityCreated()の後に呼び出されるメソッド内。


これは私が使用している方法ですが、Android開発にはかなり慣れていないため、それが正しい方法であるかどうかはわかりません。
パピポ2015

@codecasterでは、Fragment自体のgetFragmentManager()メソッドを使用してFragmentManagerを取得することもできます。回答を編集しました。
Varundroid、2015

1
getFragmentManager()をgetActivity.getSupportFragmentManager()に交換するまで、奇妙なことをしたプロジェクトがあります。
Papipo

うーん、奇妙です。これまでこのような問題に遭遇したことはありませんが、上記の解決策はどれも悪くないので、あなたのために機能するものを何でも使用できます。
Varundroid、2015

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()getSupportFragmentManagerいつでもできます。

階層はアクティビティ->フラグメントです。フラグメントはgetSupportFragmentMangerを直接呼び出すことはできませんが、アクティビティは呼び出すことができます。したがって、getActivityを使用して、フラグメントが含まれている現在のアクティビティを呼び出して取得できます。getSupportFragmentManager()


5

私の親アクティビティはAppCompatActivityを拡張するので、アクティビティだけでなくAppCompatActivityにコンテキストをキャストする必要がありました。

例えば。

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

1
((AppCompatActivity) mContext)一部はまさに私が探していたものでした。ありがとうございました!
sHOLE 2017




3

あなたはJavaで置き換えることができます

getChildFragmentManager()

コトリンでは、それを簡単にする

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());

あなたの要件は何ですか、私はあなたの要件はフラグメント内のフラグメントの助けを借りて別のページャーの中にページャーを定義することだと思います... つまり、スワイプ可能なレイアウト内でレイアウトをスワイプする必要がありますか?
マディ

1
@VJが回答を拡張するように求めた理由は、コード行が良質の回答ではないためです。質問の元の質問者以外の多くの人があなたの答えを見て、自分の問題を解決するためにそれを使いたいかもしれません。質問の元の問題が何であるか、なぜ機能しないのか、なぜソリューションが機能するのかを実際に説明すると、それらのユーザーにとって役立ちます。
psubsee2003 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.