2016-01-12 1 views
0

У меня есть приложение с двумя страницами в файле поддержки .v4.app.FragmentPagerAdapter, и все работает отлично в течение многих лет. Теперь я хотел добавить третью страницу, поэтому я просто повторно использовал один и тот же код со старых страниц для нового (смена имен идентификаторов и классов, конечно). И первое, что похоже на работу, я могу ударить с 1 - 2 - 3, но когда я красть назад к странице 2 снова я получаю InflateException на номер страницы 1:InflateException при добавлении третьей страницы в мой FragmentPagerAdapter?

01-12 14:55:53.170: E/AndroidRuntime(9080): FATAL EXCEPTION: main 
01-12 14:55:53.170: E/AndroidRuntime(9080): Process: com.magnuswikhog.adrdangerousgoods, PID: 9080 
01-12 14:55:53.170: E/AndroidRuntime(9080): android.view.InflateException: Binary XML file line #9: Error inflating class fragment 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at com.magnuswikhog.adrlibrary.SearchPageFragment.onCreateView(SearchPageFragment.java:36) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1426) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:728) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.view.ViewPager.populate(ViewPager.java:1106) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.view.ViewPager.populate(ViewPager.java:952) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.view.ViewPager$3.run(ViewPager.java:251) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.view.Choreographer.doFrame(Choreographer.java:543) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.os.Handler.handleCallback(Handler.java:733) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.os.Handler.dispatchMessage(Handler.java:95) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.os.Looper.loop(Looper.java:136) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.app.ActivityThread.main(ActivityThread.java:5086) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at java.lang.reflect.Method.invoke(Method.java:515) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at dalvik.system.NativeStart.main(Native Method) 
01-12 14:55:53.170: E/AndroidRuntime(9080): Caused by: java.lang.IllegalArgumentException: Binary XML file line #9: Duplicate id 0x7f0b00b2, tag null, or parent id 0x7f0b00b1 with another fragment for com.magnuswikhog.adrlibrary.SearchMasterFragment 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2289) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:169) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:684) 
01-12 14:55:53.170: E/AndroidRuntime(9080):  ... 27 more 

Вот мой код:

Из моего FragmentPagerAdapter подкласса:

@Override 
    public Fragment getItem(int position) { 
     Fragment fragment = null;   

     switch(position){ 
      case 0: 
       fragment = new SearchPageFragment(); 
       break; 
      case 1:     
       fragment = new LoadPageFragment(); 
       break; 
      case 2:     
       fragment = new InfoPageFragment(); 
       break; 
     } 

     return fragment; 
    } 

код для страницы 1 (т.е. SearchPageFragment):

public class SearchPageFragment extends Fragment{ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_search_page_single_page, container, false); 

     return rootView; 
    } 
} 

А расположение:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:id="@+id/searchPageFragment" > 


     <fragment 
      android:id="@+id/searchMasterFragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:name="com.magnuswikhog.adrlibrary.SearchMasterFragment" />     


</LinearLayout> 

Кажется, проблема возникает в onCreateView() страница 1, при вызове надуть() для макета страницы 1.

В идентификаторах именуется в сообщении об ошибке являются:

public static int searchMasterFragment=0x7f0b00b2; 
    public static int searchPageFragment=0x7f0b00b1; 

пытался пара «решений» мне удалось найти, когда погуглить, но до сих пор единственное, что работали в том, чтобы просто использовать FragmentStatePagerAdapter - то проблема уходит. Но мне любопытно, как я разрешу эту проблему и все еще использую FragmentPagerAdapter?

Я предполагаю, что макет снова раздувается при прокручивании назад, но ни одно из решений (удаление представления перед его повторным наполнением, удаление фрагмента в onDestroy(), сохранение вида в элементе и проверка, если это уже! = null и т. д.), которые я нашел до сих пор, смогли помочь мне предотвратить это.

BTW, я проверил, что классы библиотеки поддержки, а не стандартные, используются везде, где они должны.

+0

Один способ обхода (который действительно не решает основной проблемы), по-видимому, заключается в увеличении количества страниц, которые ViewPager сохраняет «живыми» в фоновом режиме. Использование 'mViewPager.setOffscreenPageLimit (2)' Я могу заставить его работать, но это просто прикрывает симптомы ... – BadCash

ответ

-1

FragmentPagerAdapter лучше всего использовать, когда есть несколько типичных статических фрагментов, которые нужно выгрузить, например набор вкладок. Фрагмент каждой страницы, которую посещает пользователь, будет храниться в памяти, хотя его иерархия представлений может быть уничтожена, если ее не видно. Это может привести к использованию значительного объема памяти, поскольку экземпляры фрагментов могут удерживаться в произвольном количестве состояний. Для более крупных наборов страниц рассмотрите FragmentStatePagerAdapter. for more

+0

Спасибо, но ваш ответ Google copy copy-n-paste ничего не отвечает на вопрос. Я уже сказал, что я успешно пробовал FragmentStatePagerAdapter, но мне любопытно, почему мой код не работает с FragmentPagerAdapter. – BadCash

Смежные вопросы