2017-07-27 83 views
0

正在關注this example我試圖用ViewPager的單個選項卡中的另一個替換另一個片段。我得到這個異常: java.lang.IllegalStateException: Can't change tag of fragment DailyWordFragment在ViewPager中替換片段會導致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

你爲什麼用viewpager裏面的片段經理做的事情?在getitem中,你應該返回一個Fragment的實例。 ViewPager管理片段實例的生命週期。 – Juan

+0

因爲我試圖在一個選項卡中進行片段交換。 – Brian

回答

0

交換片段在查看傳呼機的一個標籤,你必須這樣做以不同的方式:

你需要的是在去充當一個容器ViewPager片段。由ViewPager管理。這個片段總是出現在標籤中,從來不會互換或更改。

在該片段中,您有2個子片段,您可以使用與ChildFragmentManager交易進行交換。但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

我敢肯定null是Java中的對象的默認值。不過謝謝。 – Brian

+0

是的,但如果你把它從它這麼想的回空之前初始化。所以,如果你在一個片段上,仍然在同一個活動中,片段不會變爲空,但當你點擊其他片段時,它仍然被初始化。 – cotnic

+0

啊,你當然是對的。但我與其他答案一起,並將您的答案標記爲有用。 – Brian