Mit Wischansichten können Sie mit einer horizontalen Fingergeste oder Wischen zwischen gleichgeordneten Bildschirmen wie Tabs wechseln. Dieses Navigationsmuster wird auch als horizontales Paging bezeichnet.
In diesem Artikel erfahren Sie, wie Sie ein Tablayout mit Wischansichten zum Wechseln zwischen Tabs erstellen und wie Sie eine Titelleiste anstelle von Tabs anzeigen lassen.
Wischansichten implementieren
Sie können Wischansichten mit dem ViewPager2
-Widget von AndroidX erstellen.
Wenn Sie ViewPager2 und Tabs verwenden möchten, müssen Sie Ihrem Projekt eine Abhängigkeit von ViewPager2 und Materialkomponenten hinzufügen.
Wenn Sie Ihr Layout mit ViewPager2
einrichten möchten, fügen Sie Ihrem XML-Layout das <ViewPager2>
-Element hinzu. Wenn beispielsweise jede Seite in der Wischansicht das gesamte Layout ausfüllt, sieht Ihr Layout so aus:
<androidx.viewpager2.widget.ViewPager2
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Wenn Sie untergeordnete Ansichten einfügen möchten, die jede Seite darstellen, verknüpfen Sie dieses Layout mit einem FragmentStateAdapter
.
So können Sie mit dem Finger über eine Sammlung von Fragment
-Objekten wischen:
Kotlin
class CollectionDemoFragment : Fragment() { // When requested, this adapter returns a DemoObjectFragment, // representing an object in the collection. private lateinit var demoCollectionAdapter: DemoCollectionAdapter private lateinit var viewPager: ViewPager2 override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.collection_demo, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { demoCollectionAdapter = DemoCollectionAdapter(this) viewPager = view.findViewById(R.id.pager) viewPager.adapter = demoCollectionAdapter } } class DemoCollectionAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { override fun getItemCount(): Int = 100 override fun createFragment(position: Int): Fragment { // Return a NEW fragment instance in createFragment(int). val fragment = DemoObjectFragment() fragment.arguments = Bundle().apply { // The object is just an integer. putInt(ARG_OBJECT, position + 1) } return fragment } } private const val ARG_OBJECT = "object" // Instances of this class are fragments representing a single // object in the collection. class DemoObjectFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { return inflater.inflate(R.layout.fragment_collection_object, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { arguments?.takeIf { it.containsKey(ARG_OBJECT) }?.apply { val textView: TextView = view.findViewById(android.R.id.text1) textView.text = getInt(ARG_OBJECT).toString() } } }
Java
public class CollectionDemoFragment extends Fragment { // When requested, this adapter returns a DemoObjectFragment, // representing an object in the collection. DemoCollectionAdapter demoCollectionAdapter; ViewPager2 viewPager; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.collection_demo, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { demoCollectionAdapter = new DemoCollectionAdapter(this); viewPager = view.findViewById(R.id.pager); viewPager.setAdapter(demoCollectionAdapter); } } public class DemoCollectionAdapter extends FragmentStateAdapter { public DemoCollectionAdapter(Fragment fragment) { super(fragment); } @NonNull @Override public Fragment createFragment(int position) { // Return a NEW fragment instance in createFragment(int). Fragment fragment = new DemoObjectFragment(); Bundle args = new Bundle(); // The object is just an integer. args.putInt(DemoObjectFragment.ARG_OBJECT, position + 1); fragment.setArguments(args); return fragment; } @Override public int getItemCount() { return 100; } } // Instances of this class are fragments representing a single // object in the collection. public class DemoObjectFragment extends Fragment { public static final String ARG_OBJECT = "object"; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_collection_object, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { Bundle args = getArguments(); ((TextView) view.findViewById(android.R.id.text1)) .setText(Integer.toString(args.getInt(ARG_OBJECT))); } }
In den folgenden Abschnitten wird gezeigt, wie Sie Tabs hinzufügen, um die Navigation zwischen Seiten zu erleichtern.
Tabs mithilfe eines TabLayout hinzufügen
Mit TabLayout
können Sie Tabs horizontal anzeigen. In Kombination mit einem ViewPager2
bietet ein TabLayout
eine vertraute Oberfläche zum Wechseln zwischen Seiten in einer Wischansicht.
Wenn Sie ein TabLayout
in eine ViewPager2
einfügen möchten, fügen Sie ein <TabLayout>
-Element über dem <ViewPager2>
-Element hinzu:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
Erstellen Sie als Nächstes ein TabLayoutMediator
, um das TabLayout
mit dem ViewPager2
zu verknüpfen, und hängen Sie es so an:
Kotlin
class CollectionDemoFragment : Fragment() { ... override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val tabLayout = view.findViewById(R.id.tab_layout) TabLayoutMediator(tabLayout, viewPager) { tab, position -> tab.text = "OBJECT ${(position + 1)}" }.attach() } ... }
Java
public class CollectionDemoFragment extends Fragment { ... @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { TabLayout tabLayout = view.findViewById(R.id.tab_layout); new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> tab.setText("OBJECT " + (position + 1)) ).attach(); } ... }
Weitere Informationen zum Design von Tab-Layouts finden Sie in der Material Design-Dokumentation für Tabs.
Weitere Informationen
Weitere Informationen zu ViewPager2
finden Sie in den folgenden zusätzlichen Ressourcen.
Produktproben
- ViewPager2-Beispiele auf GitHub