SupportFragment + TabWidget + Samsung Device = "java.lang.IllegalStateException: Не удается выполнить это действие после onSaveInstanceState"?

У меня очень простая функция FragmentActivity, которая, используя библиотеку android.support.v4, есть только TabHost внутри FragmentActivity, который содержит 4 фрагмента.

Нет async-задачи, нет реализации onSaveInstanceState ().

Через несколько недель на рынке у меня появилось много отчетов об исключениях под названием «java.lang.IllegalStateException: не удается выполнить это действие после onSaveInstanceState» (см. Ниже трассировку стека), все от устройства Samsung (SM-N9003, GT-I9305, GT -N7100 … и т. Д.), Абсолютно никаких идей, что пойдет не так.

Раньше я искал какой-то подобный вопрос, но ответа не получил.

Макет:

<?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="match_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/realtabcontent" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <android.support.v4.app.FragmentTabHost android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="wrap_content" > <FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="0" /> </android.support.v4.app.FragmentTabHost> </LinearLayout> 

Код:

 private void setupTabs() { FragmentTabHost tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); tabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); tabHost.addTab(setIndicator(this, tabHost.newTabSpec(FragmentList), getString(R.string.tabwidget_List), R.drawable.btn_icon_order), ListFragment.class, null); tabHost.addTab(setIndicator(this, tabHost.newTabSpec(FragmentSwitch), getString(R.string.tabwidget_Switch), R.drawable.btn_icon_switch), SwitchFragment.class, null); tabHost.addTab(setIndicator(this, tabHost.newTabSpec(FragmentQueue), getString(R.string.tabwidget_Queue), R.drawable.btn_icon_queue), QueueFragment.class, null); tabHost.addTab(setIndicator(this, tabHost.newTabSpec(FragmentMore), getString(R.string.tabwidget_More), R.drawable.btn_icon_more), MoreFragment.class, null); } private TabSpec setIndicator(Context context, TabSpec tabSpec, String Title,int resId) { View view = LayoutInflater.from(context).inflate(R.layout.tab_widget, null); ImageView ivTTIcon = (ImageView) view.findViewById(R.id.ivTTIcon); ivTTIcon.setImageResource(resId); TextView tvTTText = (TextView) view.findViewById(R.id.tvTTText); tvTTText.setText(Title); return tabSpec.setIndicator(view); } 

Трассировки стека :

Java.lang.IllegalStateException: не удается выполнить это действие после onSaveInstanceState в файле android.support.v4.app.FragmentManagerImpl.checkStateLoss (FragmentManager.java:1343)
At android.support.v4.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:1354)
На android.support.v4.app.BackStackRecord.commitInternal (BackStackRecord.java:595)
На android.support.v4.app.BackStackRecord.commit (BackStackRecord.java:574)
At android.support.v4.app.FragmentTabHost.onTabChanged (FragmentTabHost.java:309)
В android.widget.TabHost.invokeOnTabChangeListener (TabHost.java:463)
На android.widget.TabHost.setCurrentTab (TabHost.java:448) на android.widget.TabHost $ 2.onTabSelectionChanged (TabHost.java:161)
В android.widget.TabWidget $ TabClickListener.onClick (TabWidget.java:563)
На android.view.View.performClick (View.java:4475) на android.view.View $ PerformClick.run (View.java:18784) на android.os.Handler.handleCallback (Handler.java:730) на android. Os.Handler.dispatchMessage (Handler.java:92) на android.os.Looper.loop (Looper.java:137) на android.app.ActivityThread.main (ActivityThread.java:5414) на java.lang.reflect.Method .invokeNative (собственный метод) в java.lang.reflect.Method.invoke (Method.java:525) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1187)
At com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1003)
В dalvik.system.NativeStart.main (родной метод)

Вот решение ,

Эта проблема возникает, если действие выбора вкладок выполняется после вызова onSaveInstanceState. Например, если пользователь выбирает и удерживает любую вкладку и одновременно выбирает кнопку «Главная».

Чтобы решить эту проблему, просто вызовите mTabHost.getTabWidget().setEnabled(false); В onPause of Fragment / Activity и вызывается mTabHost.getTabWidget().setEnabled(true); Под onResume.

Эта ошибка означает, что вы совершаете FragmentTransaction после того, как состояние активности сохранено и транзакция не будет восстановлена ​​при восстановлении активности. Здесь есть документация: http://developer.android.com/reference/android/app/FragmentTransaction.html#commit () о том, что вы можете сделать, чтобы обойти это, но вам нужно убедиться, что вы только Совершение транзакций фрагмента, когда действие / фрагмент находится в состоянии, чтобы принять их (для фрагментов: isResumed () возвращение true – хороший старт). Вы можете использовать ядерные опции commitAllowingStateLoss (), если это необходимо, но я бы рекомендовал попытаться копаться в местах, где вы вызываете commit (), и когда они могут быть вызваны в отношении жизненного цикла Activity / Fragment.

Извините, у меня нет конкретных решений для Samsung, но, надеюсь, это станет отправной точкой.