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