How to allow illegal state exception when deleting a fragment in android

I add and remove a fragment dynamically in android when deleting a fragment. I get this exception, can anyone tell me how to remove the fragment?

12-09 15:00:16.363: ERROR/AndroidRuntime(673): FATAL EXCEPTION: main 12-09 15:00:16.363: ERROR/AndroidRuntime(673): java.lang.IllegalStateException: commit already called 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at android.app.BackStackRecord.commitInternal(BackStackRecord.java:499) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at android.app.BackStackRecord.commit(BackStackRecord.java:491) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at com.gcm.fragment.GcmFragmentActivity.onClick(GcmFragmentActivity.java:50) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at android.view.View.performClick(View.java:3110) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at android.view.View$PerformClick.run(View.java:11928) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at android.os.Handler.handleCallback(Handler.java:587) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at android.os.Handler.dispatchMessage(Handler.java:92) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at android.os.Looper.loop(Looper.java:132) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at android.app.ActivityThread.main(ActivityThread.java:4025) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at java.lang.reflect.Method.invokeNative(Native Method) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at java.lang.reflect.Method.invoke(Method.java:491) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 12-09 15:00:16.363: ERROR/AndroidRuntime(673): at dalvik.system.NativeStart.main(Native Method) 

My code is below

 package com.gcm.fragment; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; public class GcmFragmentActivity extends Activity implements OnClickListener { TextView txtIhaveIdea=null; boolean subMenu=false; Fragment fragOne = new SubFragment(); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtIhaveIdea=(TextView)findViewById(R.id.txtIhaveAnIdea); txtIhaveIdea.setOnClickListener(this); ; } @Override public void onClick(View v) { // TODO Auto-generated method stub if(v.getId()==R.id.txtIhaveAnIdea) { if(!subMenu) { /*Bundle arguments = new Bundle(); arguments.putBoolean("shouldYouCreateAChildFragment", true); fragOne.setArguments(arguments); */ //ft.show(fragOne); fm.beginTransaction(); ft.add(R.id.main_frag_container, fragOne); ft.commit(); subMenu=true; } else if(subMenu) { fm.beginTransaction(); ft.remove(fragOne); ft.commit(); /*fm.beginTransaction(); ft.replace(R.id.main_frag_container, null); ft.commit();*/ subMenu=false; //ft.hide(fragOne); //ft.remove(fragOne); /*FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); fm.beginTransaction(); Fragment fragOne = new SubFragment(); Bundle arguments = new Bundle(); arguments.putBoolean("shouldYouCreateAChildFragment", true); fragOne.setArguments(arguments); ft.remove(fragOne); ft.commit(); */ } } } } /*FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); fm.beginTransaction(); Fragment fragOne = new MyFragment(); Bundle arguments = new Bundle(); arguments.putBoolean("shouldYouCreateAChildFragment", true); fragOne.setArguments(arguments); ft.add(R.id.main_frag_container, fragOne); ft.commit(); */ 

Can anyone tell me how to fix the problem.

thanks

+4
source share
1 answer

Make ft a local variable, not a class level variable

 public class GcmFragmentActivity extends Activity implements OnClickListener { TextView txtIhaveIdea=null; boolean subMenu=false; Fragment fragOne = new SubFragment(); FragmentManager fm = getFragmentManager(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtIhaveIdea=(TextView)findViewById(R.id.txtIhaveAnIdea); txtIhaveIdea.setOnClickListener(this); } @Override public void onClick(View v) { if(v.getId()==R.id.txtIhaveAnIdea){ if(!subMenu){ FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.main_frag_container, fragOne); ft.commit(); subMenu=true; }else if(subMenu){ FragmentTransaction ft = fm.beginTransaction(); ft.remove(fragOne); ft.commit(); subMenu=false; } } } } 
+45
source

Source: https://habr.com/ru/post/1385502/


All Articles