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:
- Erstellen Sie nur eine
FragmentActivity
.
- Setzen Sie
TabWidget
in FragmentActivity
Layout. Machen Sie TabWidget
's Inhalt Höhe = 0.
- Unter
TabWidget
in XML deklarieren Container für Sie Fragment
s (FrameLayout
zum Beispiel).
- In
FragmentActivity
nur Griff welche Registerkarte ausgewählt ist (TabHost.OnTabChangeListener
) und setzen Sie Fragment
in den Container.
- 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
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
Ich habe meine Antwort bearbeitet. Schau es dir an. Und es gibt auch Fragmentbeispiele in Samples ("ApiDemos"). Schau sie dir an. –
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