2013-08-08 11 views
19

Ich möchte Argumente aus meiner Aktivität an ein Fragment übergeben, das in die Aktivität eingebettet ist. Fragment ist statisch im XML-Layout eingebettet. Ich versuchte setArgument() wie folgt zu nennen:Argumente des Fragments aus Aktivität setzen

setContentView(R.layout.detail_activity); 
DetailFragment detailFragment = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment); 
detailFragment.setArguments(getIntent().getExtras()); 

aber es ist schon zu spät, weil setArguments genannt werden muss unmittelbar nach der Erstellung des Fragments. Das einzige war ich sehe es an getArguments() und das Bundle ändern. Irgendein besserer Weg?

+0

Ich schlage vor Anbringen Sie http://stackoverflow.com/a/ zu beziehen 12739968/1554935 –

+1

Nein, sie erstellen ein Fragment programmgesteuert und mein Fragment ist Teil von XML. – damluar

+0

Ich habe genau das gleiche Problem. Beispiele, die ich gesehen habe, fügen alle Fragmente in Container der Aktivität hinzu. –

Antwort

33

AFAIK, können Sie setArguments() nicht so verwenden, wenn Sie das Fragment in XML einbetten. Wenn es kritisch ist, wäre es besser, stattdessen das Fragment dynamisch hinzuzufügen. Wenn Sie jedoch wirklich möchten, dass das Fragment über XML eingebettet wird, gibt es verschiedene Möglichkeiten, diese Daten weiterzugeben.

  1. Lassen Sie die Aktivität den Ereignis-Listener des Fragments implementieren. Lassen Sie das Fragment dann die erforderlichen Parameter von der Aktivität bei der Erstellung oder wann immer erforderlich anfordern. Communication with Fragment
  2. Erstellen Sie benutzerdefinierte Attribute, die zusammen mit dem Fragment in XML eingebettet werden können. Dann parieren Sie während des Inflationsprozesses des Fragments die benutzerdefinierten Attribute, um ihre Daten zu erhalten. Custom fragment attributes
  3. Erstellen Sie öffentliche Setter in dem Fragment, und verwenden Sie die Aktivität direkt. Wenn es wichtig ist, sie vor der onCreate() Methode des Fragments zu setzen, dann tun Sie es von der Methode der Aktivität.
+2

'onAttachFragment()' ist ein guter Tipp. Vielen Dank! –

+0

Das ist eine gute Antwort, warum wird es nicht akzeptiert? Es sollte hinzugefügt werden, dass es sich hierbei um Umgehungslösungen handelt. Wenn das Fragment nicht statisch und unabhängig ist, empfiehlt es sich, das Fragment an eine durch Aktivität #setContentView definierte Containeransicht anzufügen. – 43matthew

+1

onAttachFragment() wird nicht aufgerufen. Vermisse ich etwas? – clu

5

Sie haben zwei Möglichkeiten hier

  1. Wenn Sie nur Informationen, die in der Tätigkeit der Absicht benötigen, dann Informationen von der Absicht in das Fragmente Argumente platzieren fügt nur ein nicht benötigter Schritt. Vielleicht haben Sie halten ein gut nur die Dinge einfach und von Ihrem Fragment Anruf

    Bundle data = getActivity().getIntent().getExtras(); 
    
  2. Benötigen Sie weitere Informationen hinzufügen, die dann nicht in die Tätigkeit der Absicht ist, in Ihnen einen keinen Parameter Konstruktor fragmentieren wie:

    public DetailFragment() { 
        this.setArguments(new Bundle()); 
    } 
    

dann in Ihre Aktivität können Sie, was Argumente, die Sie mit dem Code müssen hinzufügen:

DetailFragment frg = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment); 
    frg.getArguments().putBundle("key", data); 

Hier geht es darum, das vorhandene Bundle-Objekt zu verwenden, statt zu versuchen, setArguments() aufzurufen, nachdem das Fragment an die Aktivität angehängt wurde.

+0

Das PutBundle befindet sich nach setContentView, oder? Also wird das Fragment erstellt, bevor wir das Bündel hinzufügen. Müssen wir das Fragment auffrischen? Vielen Dank. – stenlytw

4

Eine weitere Möglichkeit, Daten zu Fragmente passieren ist, wie folgend:

//In DetailFragment (for Instance) define a public static method to get the instance of the fragment 

public static final DetailFragment getInstance(Bundle data) { 
    DetailFragment fragment = new DetailFragment(); 
    fragment.setArguments(data); 
    return fragment; 
} 

Und wenn DetailFragment von innen Aktivität

Bundle data = new Bundle(); 
//Add data to this bundle and pass it in getInstance() of DetailFragment 
fragmentTransaction.replace(R.id.frament_layout, DetailFragment.getInstance(data)); 
Verwandte Themen