5

Da TabActivity veraltet ist, muss ich einen Weg finden, dies mit Fragmenten zu tun. Ich habe mit Fragmenten gearbeitet, bevor ich weiß, wie es funktioniert, aber ich brauche eine Anleitung, um meinen Tab-Host mit FragmentActivities zu erstellen. Ich habe ein paar Beispiele im Internet gefunden, bei denen es darum geht, Fragmente in einen Container für die Tabs zu stecken.Ersetzen von TabActivity durch FragmentActivity und Fragmente

Was ich will, ist, FragmentCtivities für jede Registerkarte zu setzen. Weil ich in meiner Anwendung 4 Tabs verwenden werde und jeder der Tabs wirklich komplexen Inhalt enthält. Als Ergebnis muss ich eine FragmentActivity für jede Registerkarte haben, um die Fragmente zu verwalten, die ich unter jedem Tab in einem getrennten Container platzieren werde.

LÖSUNG:

Nach Antworten und die Suche im Internet I mit einer Lösung endete. Gemäß der Lösung, die ich gefunden habe, verfolge ich Fragmente in getrennten Stapeln für jede Registerkarte unter dem Register Host. Here ist mein GitHub-Repository, ich habe eine kleine Beispiel-App für dieses Problem erstellt.

Antwort

9

Da TabActivity veraltet ist, muss ich einen Weg finden, es mit Fragmenten zu tun.

Wenn Sie nicht TabActivity verwenden wollen - vergessen Sie FragmentActivities in Registerkarte Inhalt setzen.

Ich erinnere, dass Sie TabWidget ohne TabActivity verwenden können. So können Sie diese Lösung versuchen:

  1. Erstellen Sie nur eine FragmentActivity.
  2. Setzen Sie TabWidget in FragmentActivity Layout. Machen Sie TabWidget 's Inhalt Höhe = 0.
  3. Unter TabWidget in XML deklarieren Container für Sie Fragment s (FrameLayout zum Beispiel).
  4. In FragmentActivity nur Griff welche Registerkarte ausgewählt ist (TabHost.OnTabChangeListener) und setzen Sie Fragment in den Container.
  5. Setzen Sie Programmlogik (die früher in verschiedenen Aktivitäten war) in verschiedene Fragmente.

Oder Sie können FragmentActivity mit TabWidget erstellen und stattdessen Fragment s Schalt können Sie setzen direkt Fragment s in jedem Inhalt der Registerkarte.

Zum Beispiel, wenn Sie 3 Tabs und 3 Fragmente haben, versuchen Sie, was ich tue. Rufen Sie showFragmentX auf, wenn Sie ein Fragment in ein anderes ändern müssen.

public class Test extends FragmentActivity { 

private Fragment1 fragment1=new Fragment1(); 
private Fragment2 fragment2=new Fragment2(); 
private Fragment3 fragment3=new Fragment3(); 

private void showFragment1(){ 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragments_container, fragment1); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commit(); 
} 

private void showFragment2(){ 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragments_container, fragment2); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commit(); 
} 

private void showFragment3(){ 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragments_container, fragment3); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commit(); 
} 

@Override 
protected void onCreate(Bundle arg0) { 
    // TODO Auto-generated method stub 
    super.onCreate(arg0); 
    setContentView(R.layout.fragmentactivity_layout); 
} 
} 

Wenn Sie so Ihre fragmentX Variablen werden nicht jedes Mal, wenn sie in fragment_container setzen gelöscht werden.Sie werden leben, während Ihre FragmentActivity leben. Werfen Sie einen Blick auf fragments lifecycle. Nur OnCreateView und onDestroyView Methoden von Fragmenten werden immer wieder aufgerufen, während Sie replace ein Fragment zum anderen.

Auch Fragmente hat ihre onSaveInstanceState Methode, wo Sie den Zustand Ihres Fragments speichern können. Beispiel: Der Benutzer hat seinen Namen in editText von fragment1 eingegeben. Wenn Sie diese Daten (Name string) zu halten, während Benutzer andere Fragmente entdecken sollten Sie

1.save name string in onSaveInstanceState der fragment1 Methode
2. in der fragment1 onCreateView Methode Prüfung savedInstanceState Bündel, wenn es nicht null - füllen EditText mit String, den du aus dem Bundle bekommst.

public class Fragment1 extends Fragment { 

EditText nameEditText; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 

    View fragment1View=inflater.inflate(R.layout.fragment1_layout, container, false); 
    nameEditText=(EditText) fragment1View.findViewById(R.id.edittext_name); 

    //check for saved data. if it is not null - fill your edittext with saved string 
    if(savedInstanceState!=null){ 
     String nameString=(String) savedInstanceState.get("nameString"); 
     nameEditText.setText(nameString); 
    } 
    return fragment1View; 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    //save data that user have entered 
    outState.putString("nameString", nameEditText.getText().toString()); 
} 

}

Sie Daten überprüfen können vor dem Speichern. Ich hoffe, mein Punkt ist jetzt klar.

Auch wenn Sie setRetainInstance(true) in onCreateView() Methode Ihres fragment aufrufen - System wird versuchen, den Zustand des Fragments (mit allen Eingabedaten) zu speichern. link to description

+0

Thx für die Antwort, aber es kommt ein anderes Problem, wenn ich Fragmente anstelle von Aktivitäten in Tabs. Zum Beispiel in der ersten Registerkarte möchte ich den Container durch ein anderes Fragment ersetzen, falls der Benutzer auf eine Schaltfläche klickt. Wenn ich dann die Registerkarte ändere, gehe zu der zweiten, um die vorherigen Fragmente zu ersetzen. Wenn ich also zum ersten Tab gehe, wird das Fragment erneut erstellt und ich kann die vorherige Seite nicht sehen. Hast du eine Idee, wie du es loswerden kannst? – osayilgan

+0

Ich habe meine Antwort bearbeitet. Schau es dir an. Und es gibt auch Fragmentbeispiele in Samples ("ApiDemos"). Schau sie dir an. –

+0

Ja, ich habe es, aber das ist nicht die Sache, die ich frage. Ich habe mit Fragmenten gearbeitet und weiß, wie es funktioniert. Die Sache, die ich nicht weiß, ist die: Angenommen, wir sind in der ersten Registerkarte und ich rief ein anderes Fragment in dem Fall Benutzer klickt auf die Schaltfläche, für den zweiten Schritt habe ich die Registerkarte auf die zweite geändert, so wird dies hier die Daten ersetzen drin mit dem zweiten Tabs Fragment rechts? Aber ich möchte auch, dass das Ding im ersten Tab geändert wurde. Also auf diese Weise Wenn ich nur die Fragmente onTabChange ersetzen wird dies nicht den zuvor geänderten Inhalt auf der vorherigen Registerkarte beibehalten. Irgendeine Idee ? – osayilgan

1

Der Ansatz, Tab-Inhalte in separate Aktivitäten zu setzen, ist veraltet, da wir jetzt das Fragment-Framework haben. Sie sollten den komplexen Inhalt der Registerkarten in Fragmente einfügen und diese Fragmente austauschen, wenn der Benutzer Registerkarten auswählt.

Die empfohlene Lösung hierfür ist die Verwendung der ActionBar mit Registerkartennavigation, anstatt das TabHost-Widget zu verwenden.

+0

Danke für die Antwort, ich habe einige Bedenken über die Verwendung. Zum Beispiel, wenn ich ein Fragment für die erste Registerkarte, ich brauche eine Navigation innerhalb der gleichen Registerkarte und soweit ich weiß, verwenden wir nur einen Container für ganze Registerkarten und die Fragmente darin, also Nach dem Hinzufügen ein paar Fragmente zu Hauptcontainer in der ersten Registerkarte, ich werde es in die zweite Registerkarte ändern, so dass, wenn ich es tun, das wird alle Fragmente, die ich erstellt habe und in den Container in der ersten Registerkarte eingefügt und es wird das zweite Fragment an die Haupt-entfernt Container, – osayilgan

+0

, was bedeutet, dass alle Daten, die ich in der ersten Registerkarte erstellt habe, gelöscht und durch das zweite Fragment ersetzt werden? Was, wenn ich zum ersten Tab zurückkomme? Ich werde es neu erstellen? – osayilgan

Verwandte Themen