I have an app that has a navigation bar with multiple fragments.
Looking at the google play console, and looking at the crashes. I see a bunch of java.lang.IllegalArgumentExcpetion
I cannot seem to replicate the problems, and in the logs nothing points to my code.
Can anybody decipher what could be the problem?
Most of the errors look like this while some have different line numbers.
java.lang.IllegalArgumentException:
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1293)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2013)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7225)
at java.lang.reflect.Method.invoke(Native Method:0)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
EDIT:
Below is the MainActivity onNavigationItemSelected
function:
switch (id) {
case R.id.dashboard:
if (currentFragment instanceof DashboardFragment) break;
// SET DASHBOARD FRAGMENT
DashboardFragment fragment = new DashboardFragment();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
break;
case R.id.new_trans:
// CLEAR
staticTransaction.reset();
staticCart.reset();
if (currentFragment instanceof newTransFragment) break;
// SET NEW TRANS FRAGMENT
newTransFragment newTransFragment = new newTransFragment();
fragmentTransaction.replace(R.id.fragment_container, newTransFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
case R.id.trans_history:
if (currentFragment instanceof transHistoryFragment) break;
// SET TRANS HISTORY FRAGMENT
transHistoryFragment transHistoryFragment = new transHistoryFragment();
fragmentTransaction.replace(R.id.fragment_container, transHistoryFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
case R.id.orders:
if (currentFragment instanceof OrdersFragment) break;
// SET ORDERS FRAGMENT
OrdersFragment ordersFragment = new OrdersFragment();
fragmentTransaction.replace(R.id.fragment_container, ordersFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
case R.id.pos:
// CLEAR
staticTransaction.reset();
staticCart.reset();
if (currentFragment instanceof POSFragment) break;
// SET POS FRAGMENT
POSFragment posFragment = new POSFragment();
fragmentTransaction.replace(R.id.fragment_container, posFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
case R.id.products_list:
if (currentFragment instanceof ProductsFragment) break;
// SET PRODUCTS FRAGMENT
ProductsFragment productsFragment = new ProductsFragment();
fragmentTransaction.replace(R.id.fragment_container, productsFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
case R.id.customers_list:
if (currentFragment instanceof CustomersFragment) break;
// SET CUSTOMERS FRAGMENT
CustomersFragment customersFragment = new CustomersFragment();
fragmentTransaction.replace(R.id.fragment_container, customersFragment);
fragmentTransaction.commit();
break;
case R.id.account_settings:
if (currentFragment instanceof accountSettingsFragment) break;
// SET ACCOUNT SETTINGS FRAGMENT
accountSettingsFragment accountSettingsFragment = new accountSettingsFragment();
fragmentTransaction.replace(R.id.fragment_container, accountSettingsFragment);
fragmentTransaction.commit();
break;
case R.id.settings:
if (currentFragment instanceof settingsFragment) break;
// SET SETTINGS FRAGMENT
settingsFragment settingsFragment = new settingsFragment();
fragmentTransaction.replace(R.id.fragment_container, settingsFragment);
fragmentTransaction.commit();
break;
case R.id.test_connection:
if (currentFragment instanceof testConnectionFragment) break;
// SET TEST CONNECTION FRAGMENT
testConnectionFragment testConnectionFragment = new testConnectionFragment();
fragmentTransaction.replace(R.id.fragment_container, testConnectionFragment);
fragmentTransaction.commit();
break;
case R.id.sync:
if (currentFragment instanceof SyncFragment) break;
SyncFragment syncFragment = new SyncFragment();
fragmentTransaction.replace(R.id.fragment_container, syncFragment);
fragmentTransaction.commit();
break;
}
When i'm inside a fragment and want to goto another, this is the code I use to do that:
// GOTO POS
POSFragment posFragment = new POSFragment();
getFragmentManager().beginTransaction().replace(R.id.fragment_container, posFragment).addToBackStack(null).commit();
When inside a activity here is the code:
// GOTO ACCOUNT SETTINGS
accountSettingsFragment fragment = new accountSettingsFragment();
FragmentTransaction fragmentTransaction = CustomerViewActivity.this.getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
Bundle bundle = new Bundle();
bundle.putInt("timedOut", 1);
fragment.setArguments(bundle);
fragmentTransaction.commit();