FlutterFragmentのためにViewPager2を改造する


前回の記事
FlutterFragmentとViewPagerの組み合わせはonResumeのタイミングで難しかった
では、ViewPager2はページが完全遷移するまではonResumeが呼ばれないので、初回のonResumeで描画するFlutterFragmentとは相性が悪いという説明をしました。

よってすぐにonResumeが呼ばれるようにViewPager2を書き換えてみようと思います。setMaxLifecycleメソッドの呼び出しが問題なので該当部分をコメントアウトします。

Android Jetpack ソースコードのダウンロード

ViewPager2はAndroid Jetpackの一部分なのでAndroid Jetpackのソースコードをダウンロードします。

公式のダウンロード方法解説(英語)

Qiitaに日本語の解説もあります。
AndroidX をソースからビルドする

ダウンロードすると15GBになります。

注意点

多くの人はライブラリについて安定版の最新版(執筆時点ではバージョン1.0.0)を使うと思いますが、こうしてダウンロードしたバージョンはアルファ版(執筆時点ではバージョン1.1.0-alpha01)になっていると思います。バージョンを指定してダウンロードする方法は見つけられませんでした。

ライブラリモジュールを作成する

改造したViewPager2を取り込みたいプロジェクトにライブラリモジュールを追加します。

プロジェクトのルート要素で右クリックします。

Android Libraryを選択します。

モジュール名とパッケージ名を指定します。

ViewPager2のソースコードをライブラリモジュールに追加する

このようなディレクトリ構成を想定します。

~/work/androidx-master-dev
ダウンロードしたAndroid Jetpackのソースコード

~/work/quickecho
改造したViewPager2を含めたいアプリプロジェクト

cd work/androidx-master-dev/frameworks/support/viewpager2
# Javaソースコードをコピーする
cp -r viewpager2/src/main/java/androidx ~/work/quickecho/myviewpager2/src/main/java/
# リソースファイルをコピーする
cp -r viewpager2/src/main/res ~/work/quickecho/myviewpager2/src/main/

ViewPager2を書き換える

まず、リソースファイルのパッケージ名が違くてビルドできないので修正します。

ViewPager2.java
// import androidx.viewpager2.R;
import com.tfandkusu.myviewpager2.R;

問題のsetMaxLifecycleメソッド呼び出し部分をコメントアウトします。3カ所あります。

FragmentStateAdapter.java
                mFragmentManager.beginTransaction()
                        .add(fragment, "f" + holder.getItemId())
                        // .setMaxLifecycle(fragment, STARTED)
                        .commitNow();

ViewPager2を使用するモジュールからのモジュール取り込みを設定します。

build.gradle
// 略
dependencies {
    // 今回作ったライブラリモジュール
    implementation project(':myviewpager2')
    // クラス名が一緒なので本家の取り込みはコメントアウトする
    // implementation "androidx.viewpager2:viewpager2:1.0.0"
}

あとは通常のViewPager2と同じように使えば良いです。

できあがり