2012-03-07 6 views
5

私はviewPagerにいくつかのページ(フラグメント)を持っています。私はこのように、(例えば)最初のものを削除しようとした
は:フラグメントのタグを変更できません

mFragmentManager.beginTransaction().remove(Page1).commit(); 

それは私がなぜ知らない

IllegalStateException has occured. 

と言います。誰も私を助けることができますか?ありがとう。

例外:

java.lang.IllegalStateException: Can't change tag of fragment Page2{40586418 #2 id=0x7f080006 android:switcher:2131230726:2}: was android:switcher:2131230726:2 now android:switcher:2131230726:1 
+0

[Android:1つのフラグメントを別のフラグメントに置き換えることはできません](http://stackoverflow.com/questions/5907673/android-cant-replace-one-fragment-with-another) – bernie

+0

例外トレースが役立ちます。 ViewPager.setCurrentItem(int)でも同じことが起こっています。 –

+0

ViewPagerからフラグメントを削除することはどういう意味ですか? ViewPagerはFragmentのライフを管理します。あなたは、アダプタのメソッドを使用して、リストビューで削除するようなものを削除する必要があります。あなたは明確にしていただけますか? –

答えて

2

これは古い質問ですが、とにかく、ここでいくつかの情報は、それが誰かを助けることを期待しています。

ViewPagerは、ViewPager#setAdapter()を介して設定されているアダプタとともに動作します。 この質問の場合は、FragmentPagerAdapterがアダプターとして使用されているようです(このアダプターは、例外に表示されるようにandroid:switcher:[x]:[y]というフラグメントに名前を付けるので)。 FragmentPagerAdapterについて

一つの重要な観察はこれです:

FragmentPagerAdapterはViewPagerで使用されている割り当てられた断片を所有しています。

はViewPagerAdapterの組み合わせとViewPagerのユーザは次のようにプロトタイプのgetItem()メソッドを実装FragmentPagerAdapterのサブクラスを定義しなければならない:

public abstract Fragment getItem(int position); 

この関数は、ページとしてViewPagerによって使用される異なるフラグメントを作成します。 このメソッドの実装は、サブクラスがFragmentPagerAdapter()に提供するサービスとして、フラグメントを割り当てるために見える必要があります。

つまり、サブクラスはフラグメントを割り当てますが、フラグメントはその所有者ではありません。

上記のように、フラグメントの所有者はFragmentPagerAdapterであるため、すべてのフラグメント操作(FragmentManager/FragmentTransactionの意味で)はFragmentPagerAdapterによってのみ行われる必要があります。

これらのフラグメントに対して操作を実行しようとすると、ViewPagerの通常の操作が妨げられ、未定義の動作が発生する可能性があります。

この質問の場合、FragmentPagerAdapterの外でViewPagerで使用されているフラグメントの1つを削除しようとしました。このフラグメントは、説明したようにこの例外で終了したシーケンスをトリガーしました。

ViewPagerのページを動的に削除/追加/置換する必要がある場合、アダプターのnotifyDataSetChanged()を呼び出す方法があります。

幸運を祈る!

関連する問題