Como posso acessar getSupportFragmentManager () em um fragmento?


157

Eu tenho um FragmentActivity e quero usar um fragmento de mapa dentro dele. Estou com problemas para obter o gerenciador de fragmentos de suporte para acessá-lo.

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

Respostas:


278

Você pode ligar diretamente

getFragmentManager() 

para obter o gerenciador de fragmentos.

ou

No seu fragmento,

Criar campo:

private FragmentActivity myContext;

substituir o método onAttach do seu fragmento:

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

Quando você precisar obter a chamada do gerenciador de fragmentos de suporte:

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

ou

FragmentManager fragManager = myContext.getFragmentManager();

Você terminou.


3
quando eu clico primeira vez que trabalhar, mas depois que vai em algum outro fragmento novamente eu clicar sobre esta mostra página em branco ..
— DJP

11
Isso é uma sobrecarga. Veja minha resposta abaixo ... getFragmentManager () é realmente tudo o que você precisa.
— Mark

4
Você não precisa da variável mContext global aqui, basta usar getActivity () onde quer que você precise no código. Edite sua resposta para não desviar as pessoas da direção errada.
— Varundroid

3
@Varundroid. Concordo com o fato de que podemos chamar getFragmentManager () a qualquer momento. Se você puder me enviar seu ID de e-mail, eu posso enviar um código de amostra para provar que há chances de getActivity () retornar nulo.
— Eldhose M Babu

1
@ androidplusios.design Você precisa chamar getFragmentManager () e não getSupportFragementManager dentro do seu fragmento. getFragmentManager () é uma função de instância da classe Fragment e, portanto, você pode chamá-la dentro de um Fragment e usará a referência de instância atual da classe Fragment.
— precisa saber é o seguinte

83

Tudo que você precisa fazer é usar

getFragmentManager()

método no seu fragmento. Ele fornecerá o gerenciador de fragmentos de suporte quando você o usar enquanto adiciona esse fragmento.

Documentação de fragmentos


8
Essa deve ser a resposta aceita; não é aconselhável manter uma referência à atividade dos pais, conforme sugerido pela primeira resposta.
— Yoann Hercouet

1
@ Mark esta é uma resposta perfeita e deve ser a resposta aceita.
— Varundroid 12/12

3
Isso retornará android.app.Fragment. Em alguns casos, você precisa de android.support.app.v4.Fragment para que não funcione o tempo todo.
— Codificador

1
Como consertar isto? Eu acho que preciso a support.app.v4.Fragment
— Dennis Lukas

5
Isso retornará o FragmentManager apropriado. Se em um android.support.app.v4.Fragment, ele retornará a mesma coisa que o método getSupportFragmentManager () em Activity. A razão pela qual o método é chamado simplesmente getFragmentManager () nesse caso é porque não é ambíguo, ao contrário do caso de Activity.
— Blunden

44

Simplesmente compre-o assim -

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.

OU

getActivity().getSupportFragmentManager();

no método onActivityCreated () do seu Fragment e em qualquer método que esteja sendo chamado após onActivityCreated ().


É isso que eu uso, embora eu seja bastante novo no desenvolvimento do Android e não tenha certeza se é a maneira correta de fazer as coisas.
— Papipo

@ codecaster, você pode obter o FragmentManager usando o método getFragmentManager () do próprio Fragment. Eu editei minha resposta.
— Varundroid 19/02

1
Eu tenho um projeto aqui que fez coisas estranhas até que eu troquei getFragmentManager () por getActivity.getSupportFragmentManager ().
— Papipo

Hummm estranho. Nunca tive um problema como esse até agora, mas nenhuma das soluções acima é ruim para que você possa usar o que funciona melhor para você.
— Varundroid 20/02

2
Eu olhei profundamente nas aulas desde o começo. Parece que esta é a melhor solução que usa android.support.v4.app.Fragment
— DearDhruv

16

Usuários do Kotlin tentam esta resposta

(activity as AppCompatActivity).supportFragmentManager

3
Ainda bem que você colocou isso aqui, caso contrário, isso me deixaria louco Ty
— MePo 5/17/17

@ GiedriusŠlikas não está trabalhando em fragmentos ou atividades?
— Ranjith Kumar

13

se você tiver esse problema e estiver no nível 21 da API, faça o seguinte:

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

isso obterá o mapa quando usado dentro de um fragmento.


1
Tentei todas as correções de código sugeridas acima, mas não consegui fazê-las funcionar. getChildFragmentManager () fez o truque! THX.
— John Ward

que tal um nível de API abaixo de 21? Api nível 19 por exemplo?
— Aliton Oliveira

6

Você pode usar getActivity().getSupportFragmentManager()quando quiser getSupportFragmentManager.

hierarquia é Atividade -> fragmento. fragmento não é capaz de chamar diretamente getSupportFragmentManger, mas Activity pode. Assim, você pode usar getActivity para chamar a atividade atual em que o fragmento está e obtergetSupportFragmentManager()


5

Minha atividade pai estende AppCompatActivity, então tive que converter meu contexto para AppCompatActivity em vez de apenas Activity.

por exemplo.

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

1
((AppCompatActivity) mContext)parte foi exatamente o que eu estava procurando. Obrigado!
— Shole




3

em java você pode substituir por

getChildFragmentManager()

no kotlin, simplifique

childFragmentManager

espero que ajude :)


2

O código a seguir faz o truque para mim

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


1

Você pode simplesmente acessar como

Context mContext;

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

mContext = getActivity();

}

e depois use

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

1

Algum código Kotlin para usar supportFragmentManager dentro de um Fragmento.

  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() usado quando você está em atividade e deseja obter um fragmento, mas no fragmento você pode acessar

getSupportFragmentManager()

Ao usar outro método chamado, getFragmentMangaer()funciona da mesma maneira getSupportFragmentManager()e você pode usá-lo como costumava:

fragmentTransaction =getFragmentManager().beginTransaction();

0

A nova maneira simples de fazer isso no kotlin

requireActivity().supportFragmentManager

-1

Tente o seguinte:

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

Qual é o seu requisito, acho que o seu requisito é definir um pager dentro de outro pager com a ajuda de fragmentos dentro de fragmentos ..! ou seja, você precisa deslizar um layout dentro de um layout alternável?
— 21314 Maddy

1
a razão pela qual a @VJ pediu para você expandir sua resposta é porque uma linha de código não é uma resposta de boa qualidade. Muitas pessoas, além do que fez a pergunta original, verão sua resposta e podem querer usá-la para resolver seu próprio problema. Seria útil para esses usuários se você realmente explicasse qual era o problema original com a pergunta, por que não funcionou e por que sua solução funciona.
— psubsee2003
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.