Andrew Rahimov
Andrew Rahimov

Reputation: 803

implementing ActionBar Navigation List + ListFragment

App should download data and feed it into listFragment obj, but it does it only for first item "Today" in ActionBar Dropdown List. When I'm choosing second item "Soon" app crashes with error.

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

I understand that calling commit() more than once creates that error, but without commit data is not displayed on screen. Please help me, I don't know how to solve it. Any help will be appreciated.

public class MainActivity extends Activity {

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

        }

Upvotes: 0

Views: 518

Answers (1)

DroidBender
DroidBender

Reputation: 7892

Make your FragmentTransaction a local variable and not a member variable.

PSUEDO:

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

Upvotes: 3

Related Questions