web-dev-qa-db-ja.com

FragmentPagerAdapter-向きの変更を処理する方法は?

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();
}

各フラグメント内のブロードキャストレシーバーを使用してこの問題を一時的に修正しましたが、この解決策は無駄であり、メモリリークが発生する可能性があります。これを正しく修正するにはどうすればよいですか?ランドスケープモードでは別のレイアウトとロジックを使用しているので、向きを変更した後に新しく作成したフラグメントを使用したいと思います。

19
Philipp E.

はい、あなたが言ったように、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;
 }
58
SocialError

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

0
Kamil Z

OnResumeメソッドでページャーアダプターを再作成しました。

override fun onResume() {
    super.onResume()
    val viewPager = findViewById<ViewPager>(R.id.my_view_pager)
    viewPager.adapter = MyPagerAdapter(supportFragmentManager)
}
0
Trieu Doan