Aufrufen einer Fragmentmethode aus einer übergeordneten Aktivität


124

Ich sehe im Android Fragments Dev Guide, dass eine "Aktivität Methoden in einem Fragment aufrufen kann, indem sie mit findFragmentById()oder einen Verweis auf das Fragment von FragmentManager erhältfindFragmentByTag() ."

Das folgende Beispiel zeigt, wie eine Fragmentreferenz abgerufen wird, nicht jedoch, wie bestimmte Methoden im Fragment aufgerufen werden.

Kann jemand ein Beispiel geben, wie das geht? Ich möchte eine bestimmte Methode in einem Fragment aus der übergeordneten Aktivität aufrufen. Vielen Dank.

Antworten:


210

nicht genau die Frage bekommen, wie es zu einfach ist:

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

Update: Für diejenigen, die Kotlin verwenden

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

10
OK, das war einfach, danke (ich bin brandneu in Fragmenten). Jetzt ist der schwierige Teil, dass ich überhaupt keinen Hinweis auf das Fragment bekommen kann. Es ist nicht in einem XML-Layout definiert, daher kann ich findFragmentById () nicht verwenden. Und aus dem Code, dem ich folge (siehe oben), ist mir nicht klar, wie / wo das Fragment überhaupt erstellt wird. Wenn es so wäre, könnte ich einfach ein Tag hinzufügen und findFragmentByTag () verwenden. Der AccountListActivity-Teil des Beispiels hat einen Aufruf von beginTransaction (). Add (), aber laut meiner Ablaufverfolgung wird er nie aufgerufen. Hier kratz ich mir am Kopf. Ich freue mich über Vorschläge.
gcl1

34
Wie kann ich die Fragment-ID erhalten?
Narendra Singh

8
Auf diese Weise landete ich in einer Null-Objektreferenz!
Alok Rajasukumaran

3
@ Fattie, was ist, wenn ich kein Fragment-Tag habe?
Vaclovas Rekašius Jr.

5
Ich habe kein Fragment in XML deklariert ... also habe ich keine Fragment-ID. Was soll ich tun?
akash bs

76

Wenn Sie "android.app.Fragment importieren" verwenden; Verwenden Sie dann entweder:

1)

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

Wobei R.id.example_fragment höchstwahrscheinlich die FrameLayout-ID in Ihrem XML-Layout ist. ODER

2)

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

Wobei FragTagName der Name ist, den Sie angegeben haben, als Sie dies getan haben:

TabHost mTabHost.newTabSpec(“FragTagName”)

Wenn Sie "android.support.v4.app.Fragment importieren" verwenden; Verwenden Sie dann entweder:

1)

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

ODER

2)

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

1
Ich habe ein CoordinatorLayout mit der ID R.id.example_fragment, dessen Rückgabe null ist. Ich verwende import android.support.v4.app.Fragment; was ist zu tun?
Kishore

Ich schlage vor, dass Sie dies als neue Frage posten und Ihren Beispielcode hinzufügen. Es ist schwierig, die Ursache des Problems zu ermitteln, ohne den tatsächlichen Code zu sehen.
Gene

9

Wenn Sie eine Support-Bibliothek verwenden, möchten Sie Folgendes tun:

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

4
  1. Wenn Sie kein Support Library-Fragment verwenden, gehen Sie wie folgt vor:

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


2. Wenn Sie ein Support Library-Fragment verwenden, gehen Sie wie folgt vor:

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


3

Ich denke, das Beste ist zu überprüfen, ob Fragment hinzugefügt wird, bevor Methode in Fragment aufgerufen wird. Tun Sie so etwas, um eine Null-Ausnahme zu vermeiden.

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

2

Vom Fragment zur Aktivität:

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

Von der Aktivität zum Fragment:

FragmentManager fm = getSupportFragmentManager ();

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

Wenn Sie Fragment über Code hinzugefügt und beim Hinzufügen Ihres Fragments eine Tag- Zeichenfolge verwendet haben , verwenden Sie stattdessen findFragmentByTag :

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

1

Zuerst erstellen Sie eine Methode nach Ihren fragmentWünschen

public void name()
{


}

in deinem fügst activitydu das hinzu

onCreate()Methode hinzufügen

myfragment fragment=new myfragment()

Rufen Sie schließlich die Methode auf, die Sie aufrufen möchten, und fügen Sie diese hinzu

fragment.method_name();

Versuchen Sie diesen Code


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

1

Ich weiß es nicht Java, aber in C#(Xamarin.Android) muss das Fragment nicht jedes Mal nachgeschlagen werden, wenn Sie die Methode aufrufen müssen (siehe unten):

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

Ich denke, Javadu kannst das Gleiche tun.


1

Sie rufen auch die Fragmentmethode über die Schnittstelle like auf

Zuerst erstellen Sie eine Schnittstelle

public interface InterfaceName {
    void methodName();
}

Nach dem Erstellen der Schnittstelle implementieren Sie die Schnittstelle in Ihrem Fragment

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

    }
}

und Sie erstellen die Referenz der Schnittstelle in Ihrer Aktivität

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();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.