Ich habe ein Fragment, wo ich eine Methode von der FragmentActivity aufrufen möchte, die dieses Fragment enthält. Ich habe eine Methode in FragmentTabs definiert (erweitert FragmentActivity), die das lastTab-Fragment auf ein bestimmtes Ereignis im Fragment setzt. Aus irgendeinem Grund kann getActivity(). SomeUserDefinedActivity() nicht aufgelöst werden.Warum kann ich eine Methode nicht von einem Fragment zur übergeordneten Aktivität aufrufen?
Hier ist der Code zu erklären, mein Problem:
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
testButton = (Button)getView().findViewById(R.id.button1);
testButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Log.i("FragmentTest", "Button1 Clicked");
TestFragment2 f2 = new TestFragment2();
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.realtabcontent, f2);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
// This is where I want to call FragmentTabs method SetLastFragment, but I cannot access it.
getActivity().SetLastFragment(f2);
}
});
}
Dies ist die Methode, die ich in FragmentTabs anrufen möchten:
public void SetLastFragment(Fragment f)
{
mTabManager.SetLastTabFragment(f);
}
Auch im Allgemeinen: * "funktioniert nicht" * ist keine sehr spezifische Problembeschreibung. Bitte posten Sie die Fehlermeldungen, die Sie erhalten, in diesem Fall wahrscheinlich "Die Methode X ist undefiniert für die Klasse Y" oder eine ähnliche Nachricht. Hier hatte ich eine Idee, was los ist, aber das wird nicht immer so sein. Manche Dinge sind schwer zu finden ohne die Nachricht. –
@litemode: Noch besser ist es, überhaupt keine Methode für die Aktivität aufzurufen. Wenn Sie Fragmente verwenden, besteht eine gute Chance, dass Ihr Fragment von mehr als einer Aktivität gehostet wird (z. B. eine für kleinere Bildschirme, eine für größere Bildschirme). Die größte Flexibilität besteht in der Verwendung einer Listener-Schnittstelle, die dem Fragment zur Verfügung gestellt wird. Die zweitgrößte Flexibilität besteht darin, zu sagen, dass die Aktivität eine Schnittstelle implementiert und "getActivity()" auf diese Schnittstelle überträgt. – CommonsWare
Ich stimme CommonsWare zu, dass Sie die Schnittstelle verwenden sollten, um mit Ereignissen umzugehen. Das direkte Aufrufen der Methoden der Aktivität wie die obige Antwort ist jedoch nützlich, wenn Sie geschachtelte Fragmente haben, bei denen eine Aktivität ein Fragment hinzufügt, das wiederum ein weiteres Fragment hinzufügt und so weiter. Es ist einfacher, auf diese Weise auf die Methoden der Aktivität zuzugreifen, als Schnittstellen in jedem Fragment zu implementieren, um auf die Aktivität zugreifen zu können. –