Chiamata a un metodo Fragment da un'attività padre


124

Vedo nella Guida allo sviluppo di frammenti di Android che un'attività "può chiamare metodi in un frammento acquisendo un riferimento al frammento da FragmentManager, utilizzando findFragmentById()ofindFragmentByTag() ."

L'esempio che segue mostra come ottenere un riferimento al frammento, ma non come chiamare metodi specifici nel frammento.

Qualcuno può fornire un esempio di come farlo? Vorrei chiamare un metodo specifico in un frammento dall'attività principale. Grazie.

Risposte:


210

non ottenere la domanda esattamente in quanto è troppo semplice:

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

Aggiornamento: per coloro che utilizzano Kotlin

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()

10
OK, è stato facile, grazie (sono nuovo di zecca ai frammenti). Ora la parte difficile è che non riesco a ottenere un riferimento al frammento in primo luogo. Non è definito in un layout XML, quindi non posso usare findFragmentById (). E non mi è chiaro dal codice che sto seguendo (rif. Sopra) come / dove viene creato il frammento. Se lo fosse, potrei semplicemente aggiungere un tag e usare findFragmentByTag (). La parte AccountListActivity dell'esempio ha una chiamata a beginTransaction (). Add (), ma secondo la mia traccia non viene mai chiamata. Qui è dove mi sto grattando la testa. Apprezzo qualsiasi suggerimento.
gcl1

34
come posso ottenere l'id del frammento?
Narendra Singh

9
In questo modo sono finito in un riferimento a un oggetto nullo!
Alok Rajasukumaran

3
@Fattie, cosa succede se non ho un tag frammento?
Vaclovas Rekašius Jr.

5
Non ho dichiarato frammento in xml ... quindi non ho un ID frammento, cosa farò ??
akash bs

76

Se utilizzi "import android.app.Fragment;" Quindi usa:

1)

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

Dove R.id.example_fragment è molto probabilmente l'id FrameLayout all'interno del layout xml. O

2)

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

Dove FragTagName è il nome che hai specificato quando hai fatto:

TabHost mTabHost.newTabSpec(“FragTagName”)

Se utilizzi "import android.support.v4.app.Fragment;" Quindi usa:

1)

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

O

2)

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

2
Ho un CoordinatorLayout con ID R.id.example_fragment, che restituisce null. Sto usando import android.support.v4.app.Fragment; Cosa fare?
Kishore

Ti suggerisco di pubblicarlo come una nuova domanda e di includere il tuo codice di esempio. È difficile stabilire l'origine del problema senza vedere il codice effettivo.
Gene

9

Se stai usando una libreria di supporto, ti consigliamo di fare qualcosa del genere:

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();

4
  1. Se non stai utilizzando un frammento della libreria di supporto, procedi come segue:

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


2. Se stai utilizzando un frammento della libreria di supporto, procedi come segue:

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


3

Penso che la cosa migliore sia controllare se fragment viene aggiunto prima di chiamare il metodo in fragment. Fai qualcosa di simile per evitare un'eccezione nulla.

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

2

Dal frammento all'attività:

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

Dall'attività al frammento:

FragmentManager fm = getSupportFragmentManager ();

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

Se hai aggiunto un frammento tramite codice e hai utilizzato una stringa di tag quando hai aggiunto il frammento, utilizza invece findFragmentByTag :

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");

1

Per prima cosa crei il metodo nel tuo fragmentsimile

public void name()
{


}

nel tuo activityaggiungi questo

aggiungi onCreate()metodo

myfragment fragment=new myfragment()

finalmente chiama il metodo in cui vuoi chiamare aggiungi questo

fragment.method_name();

prova questo codice


1
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 

1

Non lo so Java, ma in C#(Xamarin.Android) non è necessario cercare il frammento ogni volta che è necessario chiamare il metodo, vedere di seguito:

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

Penso che Javatu possa fare lo stesso.


1

chiami anche il metodo fragment usando un'interfaccia come

per prima cosa crei l'interfaccia

public interface InterfaceName {
    void methodName();
}

dopo aver creato l'interfaccia, implementa l'interfaccia nel tuo frammento

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

    }
}

e crei il riferimento dell'interfaccia nella tua attività

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

0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.