FragmentPagerAdapter
への変更について通知する必要があるいくつかのフラグメントを含むdatabase
を使用します。これを行うには、コールバックインターフェイスを実装するフラグメントを繰り返し処理し、refreshData()
メソッドを呼び出します。
これは、デバイスの向きが変わるまでは問題なく機能します。向きを変更した後、メソッド呼び出しが機能しているように見えても、フラグメントUIは視覚的に更新されません。
私がこれまで読んだことから、これはFragmentPagerAdapter
がフラグメントのライフサイクルを処理し、コールバックを受け取るフラグメントが実際に表示されるものではないために発生します。
private class DataPagerAdapter extends FragmentPagerAdapter {
private DataFragment[] fragments = new DataFragment[] {
new FooDataFragment(), BarDataFragment()};
public DataPagerAdapter(Android.support.v4.app.FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return fragments[position];
}
@Override
public int getCount() {
return fragments.length;
}
public DataFragment[] getFragments() {
return fragments;
}
}
protected void refreshData() {
for (DataFragment dataFragment : mPagerAdapter.getFragments()) {
dataFragment.refreshData();
}
各フラグメント内のブロードキャストレシーバーを使用してこの問題を一時的に修正しましたが、この解決策は無駄であり、メモリリークが発生する可能性があります。これを正しく修正するにはどうすればよいですか?ランドスケープモードでは別のレイアウトとロジックを使用しているので、向きを変更した後に新しく作成したフラグメントを使用したいと思います。
はい、あなたが言ったように、FragmentManagerは方向の変更後にフラグメントを処理するため、アダプターのgetItem
は呼び出されません。ただし、方向を変更した後でも呼び出されるメソッドinstantiateItem()
をオーバーライドし、ObjectをFragmentにキャストして、配列に保存することができます。
@Override
public Object instantiateItem(ViewGroup container, int position) {
DataFragment fragment = (DataFragment) super.instantiateItem(container, position);
fragments[position] = fragment;
return fragment;
}
AndroidManifest.xmlのアクティビティにAndroid:configChangesフラグを設定して、アクティビティが再作成されないようにすることはできませんか?
<activity
Android:name="com.example.test.activity.MainActivity"
Android:configChanges="orientation|screenSize|keyboardHidden"/>
また、さらに多くの可能性を見つけることができます: https://Android.jlelse.eu/handling-orientation-changes-in-Android-7072958c442a
OnResumeメソッドでページャーアダプターを再作成しました。
override fun onResume() {
super.onResume()
val viewPager = findViewById<ViewPager>(R.id.my_view_pager)
viewPager.adapter = MyPagerAdapter(supportFragmentManager)
}