2017-07-27 9 views
0

次のようになります。this example ViewPagerの1つのタブ内で別のフラグメントに置き換えようとしています。私はこの例外を取得しています:この例外は、繰り返し同じフラグメントを追加する、またはフラグメントの数をミスカウント取得することによって引き起こされているように見えるが、私はこれらの場所のいずれかを見ることができない他の記事によると java.lang.IllegalStateException: Can't change tag of fragment DailyWordFragmentViewPagerのフラグメントを置き換えるとIllegalStateExceptionが発生する

class ViewPagerAdapter extends FragmentPagerAdapter { 

    private final FragmentManager fragmentManager; 
    Fragment fragment; 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
     fragmentManager = manager; 
    } 


    @Override 
    public Fragment getItem(int position) { 

     switch (position){ 
      case 0: 
       if(fragment == null){ 
        fragment = DailyWordFragment.newInstance(); 
       } 
       return fragment; 
      case 1: 
       if(fragment == null){ 
        fragment = WordListFragment.newInstance(new WordListFragment.OnWordItemAddListener() { 
         @Override 
         public void onWordItemAddListener() { 
          fragmentManager.beginTransaction().remove(fragment).commit(); 
          fragment = AddWordFragment.newInstance(); 
          notifyDataSetChanged(); 
         } 
        }); 
       } 
       return fragment; 
      default: 
       return null; 
      } 
     } 

    @Override 
    public int getItemPosition(Object object) { 
     if(object instanceof WordListFragment && fragment instanceof AddWordFragment) 
      return POSITION_NONE; 
     return POSITION_UNCHANGED; 
    } 

    @Override 
    public int getCount() { 
     return 2; 
    } 

} 

まったく存在していますか?明らかに私は何かが欠けている。助けていただければ幸いです。ありがとうございました。

+0

なぜビューポート内のフラグメントマネージャで作業していますか? getitemでは、フラグメントのインスタンスを返すだけです。 ViewPagerはフラグメントインスタンスのライフサイクルを管理します。 – Juan

+0

私は1つのタブ内でフラグメントスワップを実行しようとしているためです。 – Brian

答えて

0

ビューページャの一つのタブでフラグメントを交換するあなたは、別の方法でそれをしなければならない。

あなたはコンテナとして機能するViewPagerに行くの断片を必要としています。 ViewPagerによって管理されます。この部分は常にタブにあり、スワップや変更はありません。

このフラグメントの中には、ChildFragmentManagerでトランザクションを使用してスワップできる2つの子フラグメントがあります。しかし、ViewPagerはそれらの存在についても知らない。

+0

ありがとう私はあなたの提案を行っていきます。私は戻ってくるだろうし、それが動作する場合は、後でこれを正確にマークします。 – Brian

1

フラグメントを初期化してnullに設定する前に試しましたか?

@Override 
public Fragment getItem(int position) { 
    fragment = null 
    switch (position){ 
     case 0: 
      if(fragment == null){ 
       fragment = DailyWordFragment.newInstance(); 
      } 
      return fragment; 
     case 1: 
      if(fragment == null){ 
       fragment = WordListFragment.newInstance(new WordListFragment.OnWordItemAddListener() { 
        @Override 
        public void onWordItemAddListener() { 
         fragmentManager.beginTransaction().remove(fragment).commit(); 
         fragment = AddWordFragment.newInstance(); 
         notifyDataSetChanged(); 
        } 
       }); 
      } 
      return fragment; 
     default: 
      return null; 
     } 
    } 
+0

私はJavaでオブジェクトのデフォルト値がnullであることを確信しています。しかし、ありがとう。 – Brian

+0

はい、それ以前に初期化しておいた場合は、nullに戻りません。だからあなたがフラグメント上にあって、同じアクティビティに残っている場合、フラグメントはnullになりませんが、他のフラグメントをクリックするとまだ初期化されています。 – cotnic

+0

ああ、もちろん正しいです。しかし、私は他の答えに行き、あなたの答えを役に立つとマークしました。 – Brian

関連する問題