2012-03-28 6 views
2

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

Antwort

16

getActivity() kehrt nur ein Activity-Instanz. Dies kann jede Aktivität sein, die Ihr Fragment einbettet. SetLastFragment() ist eine Methode einer bestimmten Aktivität von Ihnen, FragmentTabs genannt. Nicht alle Aktivitäten haben diese Methode.

Das bedeutet, dass Sie es in Ihre spezifische Aktivitätsklasse umwandeln müssen. Wenn Sie Ihr Fragment in mehreren Aktivitäten verwenden, sollten Sie auch prüfen, ob die richtige Aktivität verwendet wird, z. über den instanceof Operator:

+1

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. –

+2

@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

+2

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. –