1

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) <-- 
+0

Sie müssen jedes Mal eine neue FragmentTransaction beginnen, wenn Sie eine beliebige Anzahl von Fragmentoperationen ausführen möchten. – Nas

+0

Aber das mache ich in changeContent? Könnten Sie bitte ein Beispiel nach meinem Code geben, was es sein sollte? – Simon

Antwort

0

globale FragmentTransaction entfernen und erklären, es lokal

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(); 

     FragmentTransaction 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 { 
       transaction.commit(); 
      } catch (IllegalStateException ignored) { 
       // There's no way to avoid getting this if saveInstanceState has already been called. 
      } 

     currentFragment = fragment; 
    } 
+0

Thx Nas aber das Problem liegt in onResume, was kommt da rein? Wie jetzt zeigt MainActivity überhaupt nicht. – Simon

0

Sie können versuchen, zweimal mit derselben Fragmenttransaktion nach der COMMIT-Anweisung zu committen. Erstellen Sie eine neue Fragmenttransaktion, wenn die vorherige Transaktion bereits festgeschrieben wurde.

Auch zu empfehlen commit() Verwendung Debug-Punkt.

public void changeContent(Fragment fragment, int content, boolean inBackStack) { 
........... 
........... 
    try { 
     fragmentManager.popBackStackImmediate(); 
     transaction.commit(); 
     } catch (IllegalStateException ignored) { 
     // There's no way to avoid getting this if saveInstanceState has already been called. 

........... 
........... 


     } 


@Override 
public void onResume() { 
    super.onResume(); 
     ........... 
     ........... 
     //This method would be called at second time. 

     transaction.commit(); <---- HERE THE CRASH HAPPENS 

     // Reset the boolean flag back to false for next time. 
     mReturningWithResult = false; 
     ........... 
     ........... 
    } 
Verwandte Themen