0

응용 프로그램은 데이터를 다운로드하여 listFragment obj에 제공해야하지만 ActionBar 드롭 다운 목록의 첫 번째 항목 인 "Today"에만 적용됩니다. 두 번째 항목 "Soon"을 선택하면 오류가 발생하여 앱이 다운됩니다.ActionBar 탐색 목록 + ListFragment 구현

03-21 14:53:05.272: E/AndroidRuntime(5289): FATAL EXCEPTION: main 
03-21 14:53:05.272: E/AndroidRuntime(5289): java.lang.IllegalStateException: commit already called 

나는 두 번 이상 commit() 더 호출하면 해당 오류를 생성 이해하지만이없는 커밋 데이터가 화면에 표시되지 않습니다. 제발 도와주세요, 어떻게 해결해야할지 모르겠군요. 어떤 도움을 주시면 감사하겠습니다.

공용 클래스 MainActivity가 활동을 확장 {

ParkFragment mFragment; 
    ParkFragment mFragment2; 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final String[] actions = new String[] {"Today","Soon"}; 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_spinner_dropdown_item, actions); 

     ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 

     ActionBar.OnNavigationListener navigationListener = new OnNavigationListener() { 

      @Override 
      public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
       if (actions[itemPosition] == "Today"){ 
        if (mFragment2 != null){transaction.detach(mFragment2);} 
        if (mFragment == null){ 
         mFragment = new ParkFragment("url1",MainActivity.this); 
         transaction.add(android.R.id.content, mFragment); 
         transaction.commit(); 
        }else{ 
         transaction.attach(mFragment); 
         transaction.commit(); 
        } 
        } 
        if (actions[itemPosition]== "Soon"){ 
         if (mFragment != null){transaction.detach(mFragment); 
         System.out.println("Detached");} 
        if (mFragment2 == null){ 
         mFragment2 = new ParkFragment("url2",MainActivity.this); 
         transaction.add(android.R.id.content, mFragment2); 
         transaction.commit(); 
        }else{ 
         transaction.attach(mFragment2); 
         transaction.commit(); 
        }  
       } 
       return true; 
      } 
     }; 

     actionBar.setListNavigationCallbacks(adapter, navigationListener); 

     } 

답변

3

FragmentTransaction 지역 변수가 아닌이 멤버 변수를 확인합니다.

사이비 :

if (...) { 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    //add.. do stuff 
    transaction.commit(); 
} else { 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    //add.. do stuff 
    transaction.commit(); 
} 
+0

덕분에, 작동! 하지만 한 가지 질문이 있습니다. 해킹이 아닌가요? FragmentTransaction obj를 한 번만 정의해야한다고 생각했습니다 –

+1

왜 그렇게 생각하십니까? 일단 당신이 어떤 행동을 저 지르면, 당신은 새로운'FragmentTransaction'을 열어 행동을 수행하고 저지해야 할 의무가 있습니다. 그것이 당신을 도운다면 대답을 받아들이는 것을 잊지 마십시오. 감사합니다 :) – DroidBender

+0

물론, 다시 한번 감사드립니다! :) –

관련 문제