Mostrando un fragmento en respuesta a las causas de entrada del usuario IllegalStateException

Hay un montón de preguntas con respecto a la "IllegalStateException: No se puede realizar esta acción después de OnSaveInstanceState", sin embargo no pude encontrar nada que se ocupa de una situación cuando esta excepción se plantea cuando se muestra un fragmento en respuesta a la entrada del usuario . (La aplicación solo es para Android 4.0 o superior).

En el muy iluminador artículo de Alex Lockwood leemos:

Una gran mayoría de las aplicaciones sólo realizan transacciones la primera vez que se llama onCreate () y / o en respuesta a la entrada del usuario, y nunca se enfrentará a ningún problema como resultado .

Sin embargo, es justo lo que (pienso) que estoy enfrentando. De acuerdo con el seguimiento de la pila, se genera la excepción (muy ocasionalmente) después de que un usuario hace clic en un elemento de menú de la barra de acciones:

Thread: main, Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1265) at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1276) at android.app.BackStackRecord.commitInternal(BackStackRecord.java:541) at android.app.BackStackRecord.commit(BackStackRecord.java:525) at android.app.DialogFragment.show(DialogFragment.java:230) at com.XXX.XXX.XXX.onOptionsItemSelected(SourceFile:XXX) at android.app.Activity.onMenuItemSelected(Activity.java:2507) at android.support.v4.app.g.onMenuItemSelected(SourceFile:372) at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:979) ... 

Y este es el método que plantea la excepción:

 @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.miAbout) { final DialogFragment df = DialogAbout.newInstance(); //Here we have exception very occasionally: df.show(getFragmentManager(), "about"); return true; } else { return super.onOptionsItemSelected(item); } } 

Sé que probablemente podría evitar la excepción al cometer la transacción que permite la pérdida de estado:

 @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.miAbout) { final DialogFragment df = DialogAbout.newInstance(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(df, null); ft.commitAllowingStateLoss(); return true; } else { return super.onOptionsItemSelected(item); } } 

Sin embargo, todavía no entiendo cómo es posible que la excepción se plantea en respuesta al clic del usuario. Dado que onSaveInstanceState se llama después de onPause (en post-Honeycomb), esto implicaría que la actividad sigue manejando los clics del usuario después de pausar (¡qué sorpresa!). O tal vez que los clics del usuario se manejan con cierto retraso. Sería bueno entender lo que está pasando aquí.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.