Appel d'une méthode Fragment à partir d'une activité parent

124

Je vois dans le guide de développement des fragments Android qu'une "activité peut appeler des méthodes dans un fragment en acquérant une référence au fragment à partir de FragmentManager, en utilisant findFragmentById()ou findFragmentByTag()".

L'exemple qui suit montre comment obtenir une référence de fragment, mais pas comment appeler des méthodes spécifiques dans le fragment.

Quelqu'un peut-il donner un exemple de la façon de procéder? Je voudrais appeler une méthode spécifique dans un fragment de l'activité parent. Merci.

gcl1
la source

Réponses:

210

ne pas avoir la question exactement car elle est trop simple:

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

Mise à jour: pour ceux qui utilisent Kotlin

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()
Dheeresh Singh
la source
10
OK c'était facile, merci (je suis tout nouveau dans les fragments). Maintenant, le plus dur est que je n'arrive pas à obtenir une référence au fragment en premier lieu. Ce n'est pas défini dans une mise en page XML, donc je ne peux pas utiliser findFragmentById (). Et il ne m'est pas clair d'après le code que je suis (voir ci-dessus) comment / où le fragment est même créé. Si c'était le cas, je pourrais simplement ajouter une balise et utiliser findFragmentByTag (). La partie AccountListActivity de l'exemple a un appel à beginTransaction (). Add (), mais d'après ma trace, elle n'est jamais appelée. C'est là que je me gratte la tête. J'apprécie toutes les suggestions.
gcl1
34
comment puis-je obtenir l'identifiant du fragment?
Narendra Singh
9
En faisant cela, je me suis retrouvé dans une référence d'objet nulle!
Alok Rajasukumaran
3
@Fattie, et si je n'ai pas de tag fragment?
Vaclovas Rekašius Jr.
5
Je n'ai pas déclaré de fragment en xml ... donc je n'ai pas d'identifiant de fragment, que vais-je faire ??
akash bs
76

Si vous utilisez "import android.app.Fragment;" Ensuite, utilisez soit:

1)

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

Où R.id.example_fragment est probablement l'identifiant FrameLayout dans votre mise en page XML. OU

2)

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

Où FragTagName est le nom que vous avez spécifié lorsque vous l'avez fait:

TabHost mTabHost.newTabSpec(“FragTagName”)

Si vous utilisez "import android.support.v4.app.Fragment;" Ensuite, utilisez soit:

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(); 
Gène
la source
2
J'ai un CoordinatorLayout avec l'ID R.id.example_fragment, son retour est nul. J'utilise import android.support.v4.app.Fragment; Que faire?
Kishore
Je vous suggère de poster ceci comme une nouvelle question et d'inclure votre exemple de code. Il est difficile de dire la source du problème sans voir le code réel.
Gene
9

Si vous utilisez une bibliothèque de support, vous voudrez faire quelque chose comme ceci:

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();
JDJ
la source
4
  1. Si vous n'utilisez pas de fragment de bibliothèque de support, procédez comme suit:

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


2. Si vous utilisez un fragment de bibliothèque de support, procédez comme suit:

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

Chintan Shah
la source
3

Je pense que le mieux est de vérifier si le fragment est ajouté avant d'appeler la méthode dans fragment. Faites quelque chose comme ceci pour éviter une exception nulle.

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

Du fragment à l'activité:

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

De l'activité au fragment:

FragmentManager fm = getSupportFragmentManager ();

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

Si vous avez ajouté un fragment via du code et utilisé une chaîne de balise lorsque vous avez ajouté votre fragment, utilisez à la place findFragmentByTag :

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

D' abord , vous créez dans votre méthode fragmentcomme

public void name()
{


}

dans votre activityvous ajoutez ceci

add onCreate()méthode

myfragment fragment=new myfragment()

enfin appeler la méthode à laquelle vous voulez appeler ajoutez ceci

fragment.method_name();

essayez ce code

Apprenant rapide
la source
1
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 
Kishore Reddy
la source
1

Je ne sais pas Java, mais dansC# (Xamarin.Android), il n'est pas nécessaire de rechercher le fragment à chaque fois que vous devez appeler la méthode, voir ci-dessous:

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()
    {
        // ...
    }   
}

Je pense que Javavous pouvez faire de même.

Mehdi Dehghani
la source
1

vous appelez également la méthode fragment en utilisant une interface comme

vous créez d'abord l'interface

public interface InterfaceName {
    void methodName();
}

après avoir créé l'interface, vous implémentez l'interface dans votre fragment

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

    }
}

et vous créez la référence d'interface dans votre activité

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
la source
0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
empressé
la source