スキップしてメイン コンテンツに移動

ViewPager + FragmentStatePagerAdapter画面回転時等のメモ

ViewPager + FragmentStatePagerAdapterの組み合わせでハマったのでメモしておきます。

Android端末画面回転時

主に、Android端末を倒して画面を回転させた時にgetItem()が呼ばれないとか、ViewPagerがFragmentを保持してるという仕様についてですが、保持して欲しくない時は以下をAdapter内に記述しておけばOKです。これで画面回転時にもgetItem()も呼ばれるようになります。

@Override
public Parcelable saveState() {
  return null;
}

ちなみに、Fragmentを直接削除したい場合はここ(Remove all fragments from ViewPager populated by FragmentStatePagerAdapter)で紹介されてるような方法もあります。

    List<Fragment> fragments = fragmentManager.getFragments();
   
if (fragments != null) {
       
FragmentTransaction ft = fragmentManager.beginTransaction();
       
for (Fragment f : fragments) {
           
//You can perform additional check to remove some (not all) fragments:
           
if (instanceof AddedByCurrentPagerAdapterFragment) {
                ft
.remove(f);
           
}
       
}
        ft
.commitAllowingStateLoss();

    }
Fragmentを削除してもAdapter的には保持している扱いのようなので注意(もうひと工夫?)が必要です。

instantiateItem()を扱う注意点

例えばネットワーク上のデータを取得後、ViewPager内のFragmentへデータを渡すような場合、このメソッドを実行すれば、ViewPager内の指定のポジションのFragmentを取得できますが、カレントポジションから離れてるFragmentは生成されていない(まだonCreateView()などが実行されていない)ので注意が必要です。TextViewなどへテキストをセットしようとするとNullPointerExceptionになります。Adapter側でデータを保持しつつ、現在生成されているFragmentには値セットするような実装が必要になるかと思います。

そもそもこのメソッドを使わず、Adapter側でデータを保持しつつFragment毎にメッセージレシーバを設けてメッセージを飛ばしてやるのも良いかもしれません。もちろん、Fragment側はViewが破棄されたらメッセージを受け付けないようにしておく必要があります。(FragmentのonDestroyView()あたりにunregisterReceiver()を実行するようにしておくと良いと思います。)


コメント

このブログの人気の投稿

GolangでWindows GUIアプリケーション

GUIアプリ作成の前提 社内ツールとしてexeで配布 開発環境はGoLandを使う 社内ツールとしてexeを配布ということであれば、Visual StudioでC#による開発だと思います。しかしながら、Go言語を習得したいのと、GoLandの補完機能が便利で、Android Studio使っていたこともあり、とっつきやすいという点からGo縛りでGUIアプリケーションを考えたいと思います。 lxn/walk Windows application library kit for Go. Windows向けしか考えていないので、まずこのライブラリなのですが、ボタンやコンボボックスが思ったように並ばなかったり、手軽にイメージボタンを配置したりなど、簡単にレイアウトを変更できない課題に直面しました。レイアウト作成だけで時間を取られてしまいます。そう言えば、Androidアプリ開発のときは、XMLでデザイン部分を切り離してたのを思い出して、今回の調査の運びとなりました。 fyne-io/fyne Cross platform native GUIs designed for Go based on Material Design. Supports: Linux, macOS, Windows, BSD, iOS and Android. walkと比べると、クロスプラットフォームで作成できるのですが、こちらもコードの中にデザインを書いていく形でした。 therecipe/qt therecipe/qt allows you to write Qt applications entirely in Go or JavaScript. Qt Creatorなるものがあるようで、デザイン部分を切り離せる印象はあるものの、最新のPCでもビルドに時間がかかるようで、学習コストもかかるという記事を見かけて断念しました。 どうしたものかとツイートしましたら、下記のようにご助言をいただいた。 同じ課題に対し色々試した結果、PWAのフルキャッシュドに落ち着いた。中身はGo+WASMで。 https://t.co/e60whDTV16 — のぼのぼ📡 (@nobonobo) July 21, 2020 PWA 早速調べてみました。Googleが進めているプロジェクトで、ネイティブアプリのよ

Javaでprivateなfieldやmethodにアクセスする

JUnitでテストしてると、privateなフィールドにアクセスして、値を参照したりセットしたりしたくなるわけですが、よく使うのでメモしておきます。 例えば、次のような対象のクラスがあるとします。 public class ParentClass { private String hoge = "ParentClass!!"; public void dispMsg() { System.out.println("dispMsg:" + hoge); } private void privateDispMsg(String msg) { System.out.println("dispMsg:" + msg); } }

Eclipseで一通り基本的なGitを使ってみる

備忘録的にまとめておきたいと思います。おかしな点があればご指摘いただければ幸いです。 目次 環境 プロジェクト作成~初コミットまで コミットの履歴&差分を見る 元に戻す ブランチについて ブランチを作成してみる ブランチを統合するには マージする Rebaseする ローカルリポジトリからプロジェクトを取り込む コミットしたメッセージの修正 環境 Eclipse IDE for Java Developers:Juno Service Release 1 Git:上記Eclipseのプリインストール版