Ich stolperte kürzlich in den Fehler "Kann diese Aktion nach onSaveInstanceState nicht ausführen, während die Erlaubnis (Android M) auf externen Speicher zugreifen. Ich packte und löste das Problem nach this Post (ich dachte).Commit bereits Fehler genannt, beim Ändern Fragment
Jetzt leite ich in ein neuen Problem, wie ich bekommen und Fehler „commit bereits genannt“, während ein Fragment zu ändern versuchen.
Sobald ich zu einem bestimmten Fragment (Diskussionsfragment als Beispiel) wechseln will, bekomme ich den Fehler "commit already call", siehe logcat.
Ich habe bereits nach einigen Lösungen auf stackoverflow gesucht, aber ich glaube nicht zu sehen, was falsch ist, Ich weiß, dass es zu viel gibt, aber wie man damit in meiner Situation umgehen? Kann mir bitte jemand helfen?
Anruf in Discussionfragment:
public class DiscussionsActivity extends BaseActivity
{
..
discussionsFragment = DiscussionsFragment.getInstance(id);
changeContent(discussionsFragment, R.id.content, false); <---
..
}
BaseActivity:
public class BaseActivity extends AppCompatActivity {
protected Fragment currentFragment;
protected MainFragment mainFragment;
private FragmentManager fragmentManager;
private FragmentTransaction transaction;
private boolean mReturningWithResult = false;
public void changeContent(Fragment fragment, int content, boolean inBackStack) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
try {
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
} catch (Exception e) {
}
fragmentManager = getSupportFragmentManager();
String newTag = ((Object) fragment).getClass().getName() + ":" + fragmentManager.getBackStackEntryCount();
transaction = fragmentManager.beginTransaction().replace(content, fragment, newTag);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
if (inBackStack) {
transaction.addToBackStack(fragment.getClass().getSimpleName());
} else
mReturningWithResult = true; <--- handle onSaveInstanceState error in onResume
try {
fragmentManager.popBackStackImmediate();
transaction.commit();
} catch (IllegalStateException ignored) {
// There's no way to avoid getting this if saveInstanceState has already been called.
}
currentFragment = fragment;
}
@Override
public void onResume() {
super.onResume();
if (mReturningWithResult) {
fragmentManager.popBackStackImmediate();
if (currentFragment != mainFragment) {
transaction.commit(); <---- HERE THE CRASH HAPPENS
}
}
// Reset the boolean flag back to false for next time.
mReturningWithResult = false;
}
Logcat:
FATAL EXCEPTION: main
Process: some.com.app, PID: 17374
java.lang.RuntimeException: Unable to resume activity {some.com.app/some.com.app.UI.Discussion.DiscussionsActivity_}: java.lang.IllegalStateException: commit already called
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: commit already called
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:683)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:662)
at some.com.app.UI.Base.BaseActivity.onResume(BaseActivity.java:144) <--
Sie müssen jedes Mal eine neue FragmentTransaction beginnen, wenn Sie eine beliebige Anzahl von Fragmentoperationen ausführen möchten. – Nas
Aber das mache ich in changeContent? Könnten Sie bitte ein Beispiel nach meinem Code geben, was es sein sollte? – Simon