2011-12-09 14 views
4

フラグメントを削除しながらアンドロイドでフラグメントを動的に追加および削除しています。この例外が発生しています。アンドロイドでフラグメントを削除している間に不正な状態の例外を解決する方法

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) 

私のコード

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

を下回っている誰もが問題に

答えて

45

メイクフィートローカル変数ではなく、クラスレベル変数

感謝を修正する方法を伝えることができます

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; 
     } 
     } 
    } 
} 
+0

ありがとうございましたrajdeep dua for timel yヘルプ – kumar

+0

ありがとうございます。あなたのヒントは私の問題を解決しました。しかし、その背後にあるコンセプトや、私を助ける参考サイトを教えてもらえますか? – MobiDev

+0

OK。クラスレベルの変数FragmentTransactionでコミットが既に実行されていることがわかりました。別のフラグメントに移動してもこのオブジェクトは破棄されず、再度コミットを呼び出すと問題が発生します。右? – MobiDev

関連する問題