Wywołanie metody Fragment z działania nadrzędnego

124

W przewodniku dla programistów fragmentów Androida widzę, że „działanie może wywoływać metody we fragmencie, uzyskując odwołanie do fragmentu z FragmentManager przy użyciu findFragmentById()lub findFragmentByTag()”.

Poniższy przykład pokazuje, jak uzyskać odwołanie do fragmentu, ale nie jak wywołać określone metody we fragmencie.

Czy ktoś może podać przykład, jak to zrobić? Chciałbym wywołać określoną metodę w fragmencie z działania nadrzędnego. Dzięki.

gcl1
źródło

Odpowiedzi:

210

nie otrzymaj pytania, ponieważ jest zbyt proste:

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

Aktualizacja: dla tych, którzy używają Kotlin

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()
Dheeresh Singh
źródło
10
OK, to było łatwe, dzięki (jestem nowy we fragmentach). Teraz najtrudniejsze jest to, że w pierwszej kolejności nie mogę znaleźć odniesienia do fragmentu. Nie jest zdefiniowany w układzie XML, więc nie mogę użyć funkcji findFragmentById (). I nie jest dla mnie jasne z kodu, który śledzę (odniesienie powyżej), w jaki sposób / gdzie fragment jest w ogóle tworzony. Gdyby tak było, mógłbym po prostu dodać tag i użyć funkcji findFragmentByTag (). Część przykładu AccountListActivity zawiera wywołanie funkcji beginTransaction (). Add (), ale według mojego śladu nigdy nie jest ona wywoływana. Tutaj drapię się po głowie. Doceniam wszelkie sugestie.
gcl1
34
jak mogę uzyskać identyfikator fragmentu?
Narendra Singh
9
W ten sposób znalazłem się w zerowym odwołaniu do obiektu!
Alok Rajasukumaran
3
@Fattie, a co jeśli nie mam tagu fragmentu?
Vaclovas Rekašius Jr.
5
Nie zadeklarowałem fragmentu w xml ... więc nie mam identyfikatora fragmentu, co mam zrobić?
akash bs
76

Jeśli używasz „import android.app.Fragment;” Następnie użyj:

1)

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

Gdzie R.id.example_fragment to najprawdopodobniej identyfikator FrameLayout w układzie XML. LUB

2)

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

Gdzie FragTagName to nazwa podana podczas:

TabHost mTabHost.newTabSpec(“FragTagName”)

Jeśli używasz „import android.support.v4.app.Fragment;” Następnie użyj:

1)

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

LUB

2)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 
Gen
źródło
2
Mam układ CoordinatorLayout z identyfikatorem R.id.example_fragment, zwracający wartość null. Używam importu android.support.v4.app.Fragment; co robić?
Kishore
Proponuję opublikować to jako nowe pytanie i dołączyć przykładowy kod. Trudno jest określić źródło problemu bez zapoznania się z rzeczywistym kodem.
Gene
9

Jeśli korzystasz z biblioteki wsparcia, będziesz chciał zrobić coś takiego:

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();
JDJ
źródło
4
  1. Jeśli nie używasz fragmentu biblioteki wsparcia, wykonaj następujące czynności:

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


2. Jeśli używasz fragmentu biblioteki obsługi, wykonaj następujące czynności:

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

Chintan Shah
źródło
3

Myślę, że najlepiej jest sprawdzić, czy fragment jest dodany przed wywołaniem metody we fragmencie. Zrób coś takiego, aby uniknąć zerowego wyjątku.

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
if(fragment.isAdded()){
  fragment.<specific_function_name>(); 
}
Surjit Singh
źródło
2

Od fragmentu do działania:

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

Od aktywności do fragmentu:

FragmentManager fm = getSupportFragmentManager ();

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

Jeśli dodałeś fragment za pomocą kodu i użyłeś ciągu tagu podczas dodawania fragmentu, użyj zamiast tego findFragmentByTag :

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");
Bharat Vasoya
źródło
1

Najpierw tworzysz metodę według własnego fragmentuznania

public void name()
{


}

w swoim activitydodajesz to

dodaj onCreate()metodę

myfragment fragment=new myfragment()

na koniec wywołaj metodę, w której chcesz wywołać add this

fragment.method_name();

wypróbuj ten kod

Szybki uczeń
źródło
1
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 
Kishore Reddy
źródło
1

Nie wiem Java, ale w C#(Xamarin.Android) nie ma potrzeby wyszukiwania fragmentu za każdym razem, gdy trzeba wywołać metodę, patrz poniżej:

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

Myślę, Javaże możesz zrobić to samo.

Mehdi Dehghani
źródło
1

wywołujesz również metodę fragmentu używając interfejsu takiego jak

najpierw tworzysz interfejs

public interface InterfaceName {
    void methodName();
}

po utworzeniu interfejsu implementujesz interfejs w swoim fragmencie

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

    }
}

i tworzysz odniesienie do interfejsu w swojej działalności

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
źródło
0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
chętny książę
źródło