web-dev-qa-db-fra.com

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

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

L'exemple suivant montre comment obtenir une référence à un 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? J'aimerais appeler une méthode spécifique dans un fragment de l'activité parent. Merci.

106
gcl1

ne pas avoir la question exactement comme c'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()
184
Dheeresh Singh

Si vous utilisez “import Android.app.Fragment;” Utilisez ensuite:

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 spécifié par u lorsque:

TabHost mTabHost.newTabSpec(“FragTagName”)

Si vous utilisez «importer Android.support.v4.app.Fragment;» .__, utilisez soit:

1) 

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

OR

2) 

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 
74
Gene

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

4
Chintan Shah

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

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
if(fragment.isAdded()){
  fragment.<specific_function_name>(); 
}
3
Surjit Singh
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 
1
Kishore Reddy

De fragment en activité:

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

D'activité en 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é fragment via code et utilisé une chaîne tag lors de l'ajout de votre fragment, utilisez plutôt findFragmentByTag:

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

Je ne connais pas Java, mais dans C# (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 dans Java, vous pouvez faire la même chose.

0
Mehdi Dehghani

vous appelez aussi la méthode fragment en utilisant l'interface comme 

d'abord vous créez une interface 

interface name{

void methodname();

}

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

myfragment extends Fragment implement 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 fragment();

click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

               fragment.methodname();
            }
        });

}

}
0
user10143207

D'abord, vous créez une méthode dans votre fragment comme

public void name()
{


}

dans votre activity vous ajoutez ceci 

ajouter la méthode onCreate() 

myfragment fragment=new myfragment()

enfin appeler la méthode où vous voulez appeler ajouter ceci

fragment.method_name();

essayez ce code

0
user10143207