6

Ich habe eine ViewPager mit zwei Fragments, die ich in onCreate meiner FragmentActivity instanziieren.Android - Viewpager und Fragmente, Methoden nicht funktioniert

private List<Fragment> fragments = new Vector<Fragment>(); 

fragments.add(Fragment.instantiate(this,Frag_1.class.getName())); 
fragments.add(Fragment.instantiate(this,Frag_2.class.getName())); 
    this.vPagerAdapter = new Adapt(super.getSupportFragmentManager(),fragments); 
    vPager = (ViewPager) super.findViewById(R.id.pager); 
    vPager.setAdapter(vPagerAdapter); 

Meine zweite Fragment hat eine Methode innerhalb dieses Ich rufe meine aktualisieren ListView-refreshList():

public class Frag_2 extends Fragment { 

    private ListView list; 
    private ArrayList<data> data; 
    private boolean firstCreation=true; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setRetainInstance(false); 
    } 

    public void onAttach(Activity activity) { 
     // TODO Auto-generated method stub 
     super.onAttach(activity); 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.layout, container, false); 
     list = (ListView) view.findViewById(R.id.lst); 
     //this.setRetainInstance(true); 
     return view; 
    } 


    public void refreshList(ArrayList <data> data){ 
     if(data!=null){ 
      ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data); 
      list.setAdapter(adapter);} 
    } 
} 

Genannt aus meiner FragmentActivity

//Something 
Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); 
if (fr.getView() != null) { 
    fr.refreshList(data); 
} 

Es funktioniert gut, bis ich die Ausrichtung zu ändern des Bildschirms. Korrigieren Sie mich, wenn ich falsch liege, aber ich suchte Stunden und ich fand keine Lösung oder eine gute Erklärung, die FragmentActivity wird nur einmal erstellt und die Fragments sind daran angeschlossen, aber die Fragments erstellen auf Konfigurationsänderungen neu. Nun, wenn die Ausrichtung ändert ich nicht die View von onCreate so, wenn ich versuche, die View aus der Fragment es Null zurückgibt und meine refreshList() Methode wird nicht aufgerufen. Wie kann ich das beheben?

+0

Niemand weiß, wie es zu tun? – DLock

+0

Ich habe das gleiche Problem und habe keine Lösung gefunden. Ich fange an zu denken, dass es einen Fehler in 'FragmentManager' gibt oder etwas anderes, wenn man bedenkt, dass wir beide dies erleben. – adneal

+0

Was ist mit Ihrem XML-Layout? Dies ist kein Problem für statische Fragmente, die im Layout der Aktivität deklariert sind, aber dies ist bei dynamischen Fragmenten nicht der Fall. – chip

Antwort

1

ich das Problem auf diese Weise behoben: Im onCreate des FragmentActivity

if(savedInstanceState!=null){ 
      frag1 = (frag_1) getSupportFragmentManager().getFragment(savedInstanceState, frag_1.class.getName()); 
      frag2 = (frag_2) getSupportFragmentManager().getFragment(savedInstanceState, frag_2.class.getName()); 
     } 
     else{ 
      frag1 = (frag_1) Fragment.instantiate(this,frag_1.class.getName()); 
      frag2 = (frag_2) Fragment.instantiate(this,frag_2.class.getName()); 
     } 
     fragments.add(frag1); 
     fragments.add(frag2); 


protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     getSupportFragmentManager().putFragment(outState, frag_1.class.getName(), frag1); 
     getSupportFragmentManager().putFragment(outState, frag_2.class.getName(), frag2); 
    } 

Vielleicht ist es nicht die beste Lösung im Universum, aber es sieht so aus, als ob es funktioniert ...

+0

Das funktioniert, auch die 'configChanges' im Manifest funktioniert, aber ich glaube nicht, dass dies feste Lösungen sind. Ich nehme an, dass dieser Weg funktionieren würde, wenn Sie ein oder zwei "Fragmente" haben, aber ich habe tatsächlich fünf, die dadurch beeinflusst werden. Ich bin froh, dass es für dich funktioniert. – adneal

-1

Wenn Sie ein dynamisches Fragment verwenden, müssen Sie zuerst testen, um zu verhindern, dass eine zweite Instanz eines Fragments erstellt wird.

Um zu testen, ob das System die Aktivität neu zu erstellen, überprüfen Sie, ob das Bundle Argument onCreate() ist null auf Ihre Tätigkeit des übergeben.

Wenn es nicht null ist, erstellt das System die Aktivität neu. In diesem Fall instanziiert die Aktivität automatisch vorhandene Fragmente.

Wenn es null ist, können Sie Ihr dynamisches Fragment sicher instanziieren. Zum Beispiel:

public void onCreate(Bundle savedInstanceState) { 
    // ... 
    if (savedInstanceState != null) { 
    FragmentManager fragmentManager = getFragmentManager() 
    // Or: FragmentManager fragmentManager = getSupportFragmentManager() 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    ExampleFragment fragment = new ExampleFragment(); 
    fragmentTransaction.add(R.id.fragment_container, fragment); 
    fragmentTransaction.commit(); 
    } 
} 

Die Fragment Klasse unterstützt die onSaveInstanceState(Bundle) Methode (aber nicht die onRestoreInstanceState()-Methode) in der gleichen Weise wie die Aktivitätsklasse.

  • Die Standardimplementierung speichert den Status aller Ansichten des Fragments mit IDs.
  • Sie können diese Methode überschreiben, um zusätzliche Fragmentstatusinformationen zu speichern.
  • Wenn das System das Fragment aus einem vorherigen gespeicherten Status erneut erstellt, stellt es einen Verweis auf Bundle bereit, der diesen Status zu den Methoden onCreate(), onCreateView() und onActivityCreated() enthält. Andernfalls wird das -Argument auf null festgelegt.

Wenn Sie eine detaillierte Informationen wünschen, here's ein gutes Gespräch von Ken Jones von Marakana

+0

Diese Antwort ist für die Frage nicht relevant. @DLock und ich verwenden in unserem XML nicht 'FragmentTransaction' oder statische' Fragments'. Wir verwenden 'ViewPager', das einen' FragmentPagerAdapter' fordert. – adneal

0

Wenn u wollen die Liste tun, so etwas erfrischen:

public void setView() { 
    Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); 
    fragmentManager.beginTransaction().detach(fr).commit(); 
    fragmentManager.beginTransaction().attach(fr).commit(); 
}