2

Fragments で ViewPager を使用しています。

フラグメントが表示されていないときにフラグメントの UI を変更し (imageviews の画像を削除してメモリを解放するなど)、再度表示されたときに画像を追加しようとしています。

setUserVisibleHint からフラグメントのビューにアクセスする方法がわからないため、これを行う適切な方法を見つけることができません。

onCreateView 中にビューを変数に入れようとしましたが、奇妙な理由で nullpointerexceptions が発生します。

これを行う正しい方法は何ですか?または、フラグメントが表示されていないときにフラグメントを破壊できる方法はありますか?

4

2 に答える 2

6

View ページャーには 2 つの異なるアダプターを使用できます。

  • FragmentPagerAdapter
  • FragmentStatePagerAdapter

どちらも同じように機能します。ビュー ページャーは、現在のビューと隣接するビューのみをメモリに保持します。5 ページ目にいる場合、メモリは 4,5,6 フラグメントに割り当てられます。6 ページに移動すると、4 が削除され、7 が追加されます。

2 つのアダプターの主な違いは、FragmentPagerAdapterがフラグメントのビューのみを破棄し、次にフラグメントに戻ったときに OnCreateView メソッドが開始されることです。 FragmentStatePagerAdapterはよりメモリに優しく、パフォーマンスが低下するという欠点があります。フラグメント全体を破棄し、それに戻ると、ビュー ページャーは OnCreate と OnCreateView を呼び出します。

于 2012-08-23T07:12:28.797 に答える
0

自分でビューを削除する必要はありません。各フラグメント ビューは、表示されなくなったときにonDestroyView()メソッドで自動的に破棄されFragmentます (表示されていないときにビューにアクセスしようとすると、NullPointerException が発生するのも不思議ではありません)。次にonCreateView()、フラグメントが戻って表示されると、メソッド内で再度作成されます。

詳細については、フラグメントのライフサイクルをお読み ください。

とにかく、フラグメントにアクセスしてビューに対してやりたいことをしたい場合は、この種のコード (ここから取得) を 内に実装することをお勧めしますFragmentPagerAdapter:

private Map<Integer, Fragment> mPageFragments = new HashMap<Integer, MyFragment>();

@Override
public Fragment getItem(int index) {
    Fragment myFragment = MyFragment.newInstance();
    mPageFragments.put(index, myFragment);
    return myFragment;
}

@Override
public void destroyItem(View container, int position, Object object) {
    super.destroyItem(container, position, object);
    mPageFragments.remove(position);
}

public MyFragment getFragment(int key) {
    return mPageFragments.get(key);
}

次に、(たとえば)の a 内でOnPageChangeListenerViewPager次を使用してフラグメントとビューを取得できます。

MyFragment fragment = adapter.getFragment(position);
if (fragment.getView() != null) {
   // ...
}
于 2012-08-23T06:48:54.720 に答える