iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
Mobile Development

Android Studio - 30天菜鳥筆記系列 第 26

Android Studio菜鳥筆記 - Day26 - ViewPager2+Fragment

  • 分享至 

  • xImage
  •  

ViewPager是頁面區塊內容的切換,可以用滑動的方式來切換裡面的內容。這邊直接以Fragment當作內容物實作ViewPager2。

新增ViewPager2到activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

創建3個Fragment與一個viewpager適配器(Adapter)

FragmentViewPagerAdapter.java

將FragmentViewPagerAdapter繼承FragmentStateAdapter

package com.example.viewpager_demo;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;

public class FragmentViewPagerAdapter extends FragmentStateAdapter {
    //初始化
    public FragmentViewPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
        super(fragmentActivity);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        if (position == 0){
            return new FragmentA();
        }
        else if (position == 1){
            return new FragmentB();
        }
        else {
            return new FragmentC();
        }
    }

    @Override
    public int getItemCount() {
        return 3;
    }
}

createFragment(int position)

提供Fragment創建與放置在自己該在的位置而position就是它們的位置。
但ViewPager也不是一開始就全部的Fragment都加載出來,當第一屏和第二屏時,會展示第一屏,預加載第二屏,滑動到第二屏的時候,會預加載第三屏而第一屏因為有可能從第二屏滑動回第一屏,所以不會銷毀,而滑動到第三屏,就會銷毀第一屏,第二屏不會銷毀,同理第四屏也是這樣,也就是說ViewPager有一個原則,只要是在我顯示內容的左右兩側,都會預先創建出來以方便之後的切換而其餘的內容就會被銷毀。

getItemCount()

頁面內容數量

MainActivity.java

package com.example.viewpager_demo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    private ViewPager2 viewPager;
    private FragmentViewPagerAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewPager = findViewById(R.id.viewpager);
        //創建一個adapter
        adapter = new FragmentViewPagerAdapter(this);
        //將adapter放入ViewPager
        viewPager.setAdapter(adapter);
        //指定一開始ViewPager顯示內容位置
        viewPager.setCurrentItem(0);
    }
}

上一篇
Android Studio菜鳥筆記 - Day25 - BottomNavigationView + Fragment
下一篇
Android Studio菜鳥筆記 - Day27 - Tablayout
系列文
Android Studio - 30天菜鳥筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言