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
4

1 に答える 1

2

これは古い質問ですが、誰かの役に立てば幸いです。

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

FragmentPagerAdapter に関する 1 つの重要な観察事項は次のとおりです。

FragmentPagerAdapter は、ViewPager で使用される割り当てられたフラグメントを所有します。

ViewPagerAdapter と組み合わせた ViewPager のユーザーは、次のようにプロトタイプ化された getItem() メソッドを実装する FragmentPagerAdapter のサブクラスを定義する必要があります。

public abstract Fragment getItem(int position);

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

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

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

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

この質問の場合、FragmentPagerAdapter の外部で ViewPager によって使用されるフラグメントの 1 つを削除しようとする試みがありますが、これは説明したように悪く、おそらくこの例外で終了するシーケンスをトリガーしました。

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

幸運を!

于 2015-03-31T22:28:31.380 に答える