Da dies eine sehr häufig gestellte Frage ist, wollte ich mir die Zeit und Mühe nehmen, den ViewPager mit mehreren Fragmenten und Layouts im Detail zu erklären. Bitte schön.
ViewPager mit mehreren Fragmenten und Layoutdateien - Gewusst wie
Das folgende Beispiel zeigt, wie Sie einen ViewPager mit verschiedenen Fragmenttypen und verschiedenen Layoutdateien implementieren.
In diesem Fall habe ich 3 Fragmentklassen und eine andere Layoutdatei für jede Klasse. Um die Dinge einfach zu halten, unterscheiden sich die Fragment-Layouts nur in ihrer Hintergrundfarbe . Natürlich kann jede Layoutdatei für die Fragmente verwendet werden.
FirstFragment.java hat ein orangefarbenes Hintergrundlayout, SecondFragment.java hat ein grünes Hintergrundlayout und ThirdFragment.java hat ein rotes Hintergrundlayout. Darüber hinaus zeigt jedes Fragment einen anderen Text an, je nachdem, aus welcher Klasse es stammt und aus welcher Instanz es stammt.
Beachten Sie auch, dass ich das Fragment der Support-Bibliothek verwende:
android.support.v4.app.Fragment
MainActivity.java (Initialisiert den Viewpager und verfügt über den Adapter als innere Klasse). Schauen Sie sich noch einmal die Importe an . Ich benutze das android.support.v4
Paket.
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
}
private class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int pos) {
switch(pos) {
case 0: return FirstFragment.newInstance("FirstFragment, Instance 1");
case 1: return SecondFragment.newInstance("SecondFragment, Instance 1");
case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1");
case 3: return ThirdFragment.newInstance("ThirdFragment, Instance 2");
case 4: return ThirdFragment.newInstance("ThirdFragment, Instance 3");
default: return ThirdFragment.newInstance("ThirdFragment, Default");
}
}
@Override
public int getCount() {
return 5;
}
}
}
activity_main.xml (Die .xml-Datei von MainActivitys) - eine einfache Layoutdatei, die nur den ViewPager enthält, der den gesamten Bildschirm ausfüllt.
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
Die Fragmentklassen FirstFragment.java
importieren android.support.v4.app.Fragment;
public class FirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.first_frag, container, false);
TextView tv = (TextView) v.findViewById(R.id.tvFragFirst);
tv.setText(getArguments().getString("msg"));
return v;
}
public static FirstFragment newInstance(String text) {
FirstFragment f = new FirstFragment();
Bundle b = new Bundle();
b.putString("msg", text);
f.setArguments(b);
return f;
}
}
first_frag.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_dark" >
<TextView
android:id="@+id/tvFragFirst"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textSize="26dp"
android:text="TextView" />
</RelativeLayout>
SecondFragment.java
public class SecondFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.second_frag, container, false);
TextView tv = (TextView) v.findViewById(R.id.tvFragSecond);
tv.setText(getArguments().getString("msg"));
return v;
}
public static SecondFragment newInstance(String text) {
SecondFragment f = new SecondFragment();
Bundle b = new Bundle();
b.putString("msg", text);
f.setArguments(b);
return f;
}
}
second_frag.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_green_dark" >
<TextView
android:id="@+id/tvFragSecond"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textSize="26dp"
android:text="TextView" />
</RelativeLayout>
ThirdFragment.java
public class ThirdFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.third_frag, container, false);
TextView tv = (TextView) v.findViewById(R.id.tvFragThird);
tv.setText(getArguments().getString("msg"));
return v;
}
public static ThirdFragment newInstance(String text) {
ThirdFragment f = new ThirdFragment();
Bundle b = new Bundle();
b.putString("msg", text);
f.setArguments(b);
return f;
}
}
Third_Frag.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_light" >
<TextView
android:id="@+id/tvFragThird"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textSize="26dp"
android:text="TextView" />
</RelativeLayout>
Das Endergebnis ist das Folgende:
Der Viewpager enthält 5 Fragmente, Fragmente 1 sind vom Typ FirstFragment und zeigen das Layout first_frag.xml an, Fragment 2 ist vom Typ SecondFragment und zeigt die zweite_frag.xml an, und Fragment 3-5 sind vom Typ ThirdFragment und alle zeigen die dritte_frag.xml an .
Oben sehen Sie die 5 Fragmente, zwischen denen Sie durch Wischen nach links oder rechts wechseln können. Natürlich kann immer nur ein Fragment gleichzeitig angezeigt werden.
Zu guter Letzt:
Ich würde empfehlen, dass Sie in jeder Ihrer Fragmentklassen einen leeren Konstruktor verwenden.
Verwenden Sie die newInstance(...)
Methode und die Bundle
zur Übergabe von Parametern, anstatt potenzielle Parameter über den Konstruktor zu übergeben.
Auf diese Weise kann der Objektstatus über die Argumente gespeichert werden, wenn er getrennt und erneut angehängt wird. Ähnlich wie Bundles
an Intents
.