0

私は最初の一歩を踏み出す Android プログラマーです。私のアプリでは、ViewPager (support.v4) を使用することにしました。

私は非常に典型的な方法ですべてのフラグメントを作成します:

@Override
public void onCreate(Bundle savedInstanceState) {

(...)
        //let's initialize view pager
        List<Fragment> fragments = new ArrayList<Fragment>();
        fragments.add(new MainActivitySelectDatabase());
        fragments.add(new MainActivityDetails());
        mainActivityPageAdapter = new MainActivityPageAdapter(getSupportFragmentManager(), fragments);
        mainActivityViewPager = (ViewPager) findViewById(R.id.main_activity_view_pager);
        mainActivityViewPager.setAdapter(mainActivityPageAdapter);
(...)

    }

次に、次の方法で 1 つのイベントについてすべてのフラグメントに通知したいと思います。

protected void informAllFragmentsWhenDatabaseStatusChanged () {
    for (int i=0; i<mainActivityPageAdapter.getCount(); i++) {
        ((InterfaceMainDatabaseStatusChanged) mainActivityPageAdapter.getItem(i)).onMainDatabaseStatusChanged();
    }

}

画面の向きを変更しなければ、すべて問題なく動作するようです。私がそれを変えると、すべてが狂ってしまいます。Fragment の getActivity や getApplication などのメソッドは null を返します。理由は不明ですが、新しいフラグメントではなく、古いバージョンのフラグメントに対してメソッドが実行されていると思います。それはどのように解決されるべきですか?メイン アクティビティからすべてのフラグメントの現在のバージョンを一覧表示する方法は?

助けてくれてありがとう。

4

1 に答える 1

1

理由は不明ですが、新しいフラグメントではなく、古いバージョンのフラグメントに対してメソッドが実行されていると思います。

これらの不明な理由は、 がそのページのフラグメントの有効なインスタンスを持っていない場合にのみメソッドViewPagerを呼び出すことです (構成の変更後、は を介し​​てこれらのフラグメントへの参照を持ちます)。あなたのオプションは、フラグメントのリストを取り除き、単に適切なフラグメントをメソッドで直接インスタンス化する(また、別のメソッドを使用してフラグメントにアクセスする) か、アダプターをさらに拡張して、リストが常に適切な参照を持つようにすることです。のフラグメント。getItem()ViewPagerFragmentManagergetItem()ViewPager

オプション 1 については、この質問をご覧ください。インターフェイスによる通信を実装しViewPageronAttachメソッドの各フラグメントをある種のWeakReference構造のアクティビティに登録することもできます(フラグメントにアクセスする必要がある場合はこれを使用します)。

アダプターをさらに拡張するには、instantiateItem()メソッドを見てください。

于 2013-10-28T20:50:08.127 に答える