2017-01-21 3 views
1

Я разрабатываю простой веб-баузер с динамическими вкладками, чтобы пользователь мог добавлять/удалять их. Для этого я использую FragmentPagerAdapter, ViewPager и TabLayout. Если я создам 2 вкладки (добавьте 2 фрагмента в список), а затем удаляю второй, все будет хорошо работать, и я могу добавить еще один фрагмент в список. Но если добавить 2 и затем удалить пихты один и попытаться добавить новый фрагмент в список, я получаю исключение:Android FragmentPagerAdapter не может изменить тег фрагмента

java.lang.IllegalStateException: Can't change tag of fragment Page{162e3786 #1 id=0x7f0d007d android:switcher:2131558525:1}: was android:switcher:2131558525:1 now android:switcher:2131558525:0 

Я думаю, то потому что каждый фрагмент имеет уникальный идентификатор внутри FragmentPagerAdapter. 2 фрагмента будут иметь id 0 и 1. Если я удалю первый элемент (id равен 0), а затем добавлю новый (id будет 1). Но элемент с id 1 уже существует! Есть ли способ изменить программный код id или установить id при создании фрагментов? Заранее спасибо!

Мои FragmentPagerAdapter:

public class PagerAdapter extends FragmentPagerAdapter { 

    private List<Page> fragments; 

    public PagerAdapter(FragmentManager fm, List<Page> pages) { 
     super(fm); 
     this.fragments = pages; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return this.fragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return this.fragments.size(); 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     int index = pages.indexOf(object); 
     if (index == -1){ 
      return PagerAdapter.POSITION_NONE; 
     } else { 
      return index; 
     } 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     FragmentManager manager = ((Fragment) object).getFragmentManager(); 
     FragmentTransaction trans = manager.beginTransaction(); 
     trans.remove((Fragment) object); 
     trans.commit(); 
    } 
} 

ответ

1

Наконец, после часа поисков и попыток я нашел решение. Чтобы исправить это, вам необходимо переопределить метод getItemId()FragmentPagerAdapter, в котором вы должны вернуть уникальный идентификатор для каждого фрагмента.