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

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.

Eldhose M Babu
fonte
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

Marca
fonte
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 ().

Varundroid
fonte
É 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
Ranjith Kumar
fonte
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.

bsautner
fonte
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()

Emil Reña Enriquez
fonte
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();
Akinola Olayinka
fonte
1
((AppCompatActivity) mContext)parte foi exatamente o que eu estava procurando. Obrigado!
Shole
3

faça isso no seu fragmento

getActivity().getSupportFragmentManager()
philip mudenyo
fonte
3

getActivity().getFragmentManager() Isso funcionou ou eu.

Também dê uma olhada aqui.

Aravindh Gopi
fonte
3
((AppCompatActivity) getActivity()).getSupportFragmentManager()
Diako Hasani
fonte
3

em java você pode substituir por

getChildFragmentManager()

no kotlin, simplifique

childFragmentManager

espero que ajude :)

Vanya Rachel
fonte
2

O código a seguir faz o truque para mim

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

Você pode usar childFragmentManager dentro de Fragments.

Kishan Solanki
fonte
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();
Ashwini.patil
fonte
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()

      }
noelmcloughlin
fonte
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();
Mohamed Ayed
fonte
0

A nova maneira simples de fazer isso no kotlin

requireActivity().supportFragmentManager
Reza
fonte
-1

Tente o seguinte:

private SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());
Maddy
fonte
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