Chamando um método Fragment de um pai Atividade

124

Vejo no Android Fragments Dev Guide que uma "atividade pode chamar métodos em um fragmento adquirindo uma referência ao Fragment do FragmentManager, usando findFragmentById()or findFragmentByTag()".

O exemplo a seguir mostra como obter uma referência de fragmento, mas não como chamar métodos específicos no fragmento.

Alguém pode dar um exemplo de como fazer isso? Eu gostaria de chamar um método específico em um fragmento da atividade pai. Obrigado.

gcl1
fonte

Respostas:

210

não receba a pergunta exatamente porque é muito simples:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.<specific_function_name>(); 

Atualização: Para quem está usando o Kotlin

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()
Dheeresh Singh
fonte
10
OK, foi fácil, obrigado (sou novo em fragmentos). Agora, a parte difícil é que não consigo obter uma referência ao fragmento em primeiro lugar. Ele não está definido em um layout XML, portanto, não posso usar findFragmentById (). E não está claro para mim a partir do código que estou seguindo (ref acima) como / onde o fragmento é criado. Se fosse, eu poderia apenas adicionar uma tag e usar findFragmentByTag (). A parte AccountListActivity do exemplo tem uma chamada para beginTransaction (). Add (), mas, pelo meu rastreio, nunca é chamado. É aqui que estou coçando a cabeça. Agradeço todas as sugestões.
Gcl1
34
como posso obter o ID do fragmento?
Narendra Singh
8
Ao fazer isso, acabei em uma referência de objeto nulo!
Alok Rajasukumaran
3
@Attie, e se eu não tiver tag de fragmento?
Vaclovas Rekašius Jr.
5
Eu não declarei fragmento em xml ... então eu não tenho id de fragmento, o que vou fazer?
akash bs
76

Se você estiver usando "import android.app.Fragment;" Então use:

1)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

Onde R.id.example_fragment é provavelmente o ID FrameLayout dentro do seu layout xml. OU

2)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 

Onde FragTagName é o nome que você especificou quando fez:

TabHost mTabHost.newTabSpec(“FragTagName”)

Se você estiver usando "import android.support.v4.app.Fragment;" Então use:

1)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

OU

2)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 
Gene
fonte
1
Eu tenho um CoordinatorLayout com o ID R.id.example_fragment, seu retorno nulo. Estou usando o import android.support.v4.app.Fragment; o que fazer?
Kishore
Sugiro que você publique isso como uma nova pergunta e inclua seu código de exemplo. É difícil dizer a origem do problema sem ver o código real.
Gene
9

Se você estiver usando uma biblioteca de suporte, faça algo assim:

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();
JDJ
fonte
4
  1. Se você não estiver usando um fragmento da biblioteca de suporte, faça o seguinte:

((FragmentName) getFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


2. Se você estiver usando um fragmento da biblioteca de suporte, faça o seguinte:

((FragmentName) getSupportFragmentManager().findFragmentById(R.id.fragment_id)).methodName();

Chintan Shah
fonte
3

Eu acho que o melhor é verificar se o fragmento é adicionado antes de chamar o método no fragmento. Faça algo assim para evitar exceção nula.

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
if(fragment.isAdded()){
  fragment.<specific_function_name>(); 
}
Surjit Singh
fonte
2

Do fragmento à atividade:

((YourActivityClassName)getActivity()).yourPublicMethod();

Da atividade ao fragmento:

FragmentManager fm = getSupportFragmentManager ();

//if you added fragment via layout xml
YourFragmentClass fragment = 
(YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();

Se você adicionou fragmento via código e usou uma sequência de tags ao adicionar seu fragmento, use findFragmentByTag :

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");
Bharat Vasoya
fonte
1

Primeiro você cria um método fragmentcomo você

public void name()
{


}

no seu activityvocê adiciona isso

adicionar onCreate()método

myfragment fragment=new myfragment()

por fim, chame o método para o qual você deseja ligar, adicione este

fragment.method_name();

tente este código

Aprendiz rápido
fonte
1
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 
Kishore Reddy
fonte
1

Eu não sei Java, mas no C#(Xamarin.Android) não há necessidade de procurar o fragmento toda vez que você precisar chamar o método, veja abaixo:

public class BrandActivity : Activity
{
    MyFragment myFragment;

    protected override void OnCreate(Bundle bundle)
    {       
        // ...
        myFragment = new MyFragment();      
        // ...
    }

    void someMethod()
    {
        myFragment.MyPublicMethod();
    }
}

public class MyFragment : Android.Support.V4.App.Fragment
{
    public override void OnCreate(Bundle bundle)
    {
        // ...
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
    {
        // ...
    }

    public void MyPublicMethod()
    {
        // ...
    }   
}

Eu acho que Javavocê pode fazer o mesmo.

Mehdi Dehghani
fonte
1

você também chama o método fragment usando interface como

primeiro você cria interface

public interface InterfaceName {
    void methodName();
}

depois de criar a interface, você implementa a interface no seu fragmento

MyFragment extends Fragment implements InterfaceName {
    @overide
    void methodName() {

    }
}

e você cria a referência da interface em sua atividade

class Activityname extends AppCompatActivity {
    Button click;
    MyFragment fragment;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);

        click = findViewById(R.id.button);

        fragment = new MyFragment();

        click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               fragment.methodName();
            }
        });
    }
}
mXaln
fonte
0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
ansioso
fonte