2012-04-01 6 views
1

Ich versuche, eine Spinner-Ansicht von einem hinzugefügten Fragment zu meiner Aktivität zu bekommen, aber es scheint, dass ich weder das Fragment noch die Ansicht bekommen kann.Suche nach Fragmentansicht der Aktivität. Android findFragmentByTag (String-Tag) gibt null zurück

Ich habe eine Aktivität, die ein Fragment fügt es LinearLayout ist, das Layout des Fragments auf dem ‚Extra‘ basiert, die von der Absicht der Aktivität kommt. Alles wird korrekt angezeigt, und ich kann alle Ansichten des Fragments sehen, aber aus irgendeinem Grund, wenn ich findFragmentByTag(String tag) rufe, gibt es null zurück und daher kann ich getView() nicht aufrufen.

Hier ist, wie ich das Fragment Code meiner Tätigkeit bin Zusatz:

...onCreate(){ 
    ... 
    FragmentManager fm = getFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 

    Fragment fr = new Fragment(){ 
     @Override 
     public View onCreateView(LayoutInflater inflater, 
       ViewGroup container, Bundle savedInstanceState) { 
      return inflater.inflate(layoutID, container, false); 
     } 
    }; 
    ft.add(R.id.formsListActivity_Container, fr, "form_fragment_tag"); 

    ft.commit(); 
    ... 

}

Dann versuche ich solches Fragment zu erhalten und eine des Spinners Ansicht zu erhalten, um die String-Array hinzuzufügen:

Fragment f = fm.findFragmentByTag("form_fragment_tag"); 
Spinner spinner = (Spinner) f.getView().findViewById(R.id.city_spinner); 
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
     R.array.city_list, android.R.layout.simple_spinner_item); 
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spinner.setAdapter(adapter); 

Aber ich habe eine null-Ausnahme, weil findFragmentByTag() gibt null

Was mache ich falsch? Ich habe den Code einige Male verifiziert und die Tags sind identisch. Ich habe auch sichergestellt, dass die ID des Spinner korrekt in der XML-Layout-Datei ist, und das Fragment lädt das richtige XML-Layout, weil ich es sehen kann (Wenn ein Kommentar die Ansicht von Fragment-Teil bekommen).

+0

Ich weiß, dass dieser Beitrag alt ist, aber wenn Sie das 'Fragment' in eine eigene Klasse stellen, wird es viel einfacher. – JDJ

Antwort

7

ich das Problem gelöst haben, so scheint es, dass auf der Grundlage des Lebenszyklus sowohl die Aktivität und das Fragment durch die Zeit, die findFragmentById() in der onCreate ausgeführt wird() wurde das Fragment nicht ‚eigentlich schon erstellt ', Testete ich dies, indem ich eine einfache Schaltfläche zum Layout hinzufügte und eine Methode einführte, die, wenn auf die Schaltfläche geklickt wurde, der Drehknopf mit Daten gefüllt wird.

Aber natürlich möchte ich nicht, dass der Benutzer auf eine Schaltfläche "Laden" klicken, um den Spinner zu füllen, stattdessen habe ich auf meinem Fragment die public void onActivityCreated() Methode implementiert.

als Referenz hier ist mein Code des Fragments:

Fragment fr = new Fragment(){ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(layoutID, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Spinner spinner = (Spinner) this.getView().findViewById(R.id.city_spinner); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.city_list, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); 
    } 

}; 
+0

Herzlichen Glückwunsch zum Fix! Wenn Sie in der Lage sind, achten Sie bitte darauf, Ihre Antwort als "akzeptiert" zu markieren, damit andere von Ihrem Erfolg lernen können. Prost ~ –

+0

Angesichts so vieler Lifecycle-Methoden, die Fragmenten zur Verfügung stehen, ist es sehr schwierig, das richtige Timing für verschiedene Aktionen zu wählen.onActivityCreated scheint auch für mich gearbeitet zu haben – rmirabelle

0

Versuchen Sie, false zu true in Ihrer Aufblaslinie zu ändern.

return inflater.inflate(layoutID, container, true); 
+1

Ich habe es geändert, aber immer noch null, ich lese die Dokumente für die Methode und das letzte Boolesche sagt ist: 'attachToRoot - Ob die überhöhte Hierarchie an den Root-Parameter angehängt werden soll? Wenn false, wird root nur verwendet, um die korrekte Unterklasse von LayoutParams für die Stammansicht im XML zu erstellen. Ich verstehe wirklich nicht, was es bedeutet. – DanyBoricua

+0

Ich schätze, Ihr Container ist null, also wird das Fragment nie hinzugefügt. –

+0

Danke für Ihre Hilfe, ich konnte das Problem lösen. – DanyBoricua

2

Ich hatte das gleiche Problem, das ich es gelöst, indem die findFragmentByTag() in dem Verfahren

protected void onStart() 
{ 
} 

Lebenszyklus aufgerufen wird.