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();
}
各フラグメント内でブロードキャスト レシーバーを使用してこの問題を一時的に修正しましたが、この解決策は無駄が多く、メモリ リークが発生する可能性があります。これを適切に修正するにはどうすればよいでしょうか。ランドスケープ モードでは異なるレイアウトとロジックを使用するため、方向の変更後に新しく作成されたフラグメントを使用したいと考えています。
ベストアンサー1
はい、おっしゃるとおり、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;
}