Noufal
Noufal

Reputation: 447

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

I am developing an android application.i am using drawer in a fragment.there is three menus in the drawer.all works fine until i introduced password checking before loading the fragment in the layout according to the menu selected.for the first time it works fine,where fragment is null.the problem arises when fragment is not null.i.e, when try to replace an existing fragment with the selected menu.when i give the correct password i got forceclose. i am checking the password with a outside class using activity for result. I tried alot.help me with your suggetions.thanks in advance ..

Here is my Class,

 public class TruckInventoryFragment extends SherlockFragment {
        private DrawerLayout mDrawerLayout;
        private ListView mDrawerList;
        private ActionBarDrawerToggle mDrawerToggle;
        Fragment fragment;
        private CharSequence mDrawerTitle;
        private CharSequence mTitle;
        private String[] navMenuTitles;
        private TypedArray navMenuIcons;
        private ArrayList<NavDrawerItem> navDrawerItems;
        private NavDrawerListAdapter adapter;
        int pos;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Get the view from fragmenttab2.xml
        View view = inflater.inflate(R.layout.truckinventoryfragment,
                container, false);
        return view;
    }



    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        mTitle = mDrawerTitle = getActivity().getTitle();

        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        // nav drawer icons from resources
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);

        mDrawerLayout = (DrawerLayout) getActivity().findViewById(
                R.id.drawer_layout);
        mDrawerList = (ListView) getActivity().findViewById(
                R.id.list_slidermenu);
        navDrawerItems = new ArrayList<NavDrawerItem>();

            navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons
                .getResourceId(0, -1)));
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons
                .getResourceId(1, -1)));
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons
                .getResourceId(2, -1)));

        // Recycle the typed array
        navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        // setting the nav drawer list adapter
        adapter = new NavDrawerListAdapter(getActivity()
                .getApplicationContext(), navDrawerItems);
        mDrawerList.setAdapter(adapter);


        mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout,
                R.drawable.ic_drawer, // nav menu toggle icon
                R.string.app_name, // nav drawer open - description for
                                    // accessibility
                R.string.app_name // nav drawer close - description for
                                    // accessibility
        ) {
            public void onDrawerClosed(View view) {
                // getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                // invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                // getActionBar().setTitle(mDrawerTitle);
                // // calling onPrepareOptionsMenu() to hide action bar icons
                // invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);


    }

    /**
     * Slide menu item click listener
     * */
    private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // display view for selected nav drawer item
            displayView(position);
        }
    }


    public void checkfragment()
    {
        if (fragment != null) {
            FragmentManager fragmentManager = getChildFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.truckinventory_form_fragmentgroup, fragment)
                    .commit();

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(pos, true);
            mDrawerList.setSelection(pos);
            setTitle(navMenuTitles[pos]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }
    }
    private void displayView(int position) {
        // update the main content by replacing fragments
        fragment = null;
        pos = position;
        Intent i;
        switch (position) {
        case 0:
    //      fragment = new FragmentLoadOut();
            i = new Intent(getActivity(), RoutePasswords.class);
            i.putExtra("activity", "LoadOutPass");
            startActivityForResult(i, 11);
            break;

        case 1:
            i = new Intent(getActivity(), RoutePasswords.class);
            i.putExtra("activity", "LoadTransferPass");
            startActivityForResult(i, 12);
    //      fragment = new FragmentLoadtransfer();

            break;

        case 2:
            i = new Intent(getActivity(), RoutePasswords.class);
            i.putExtra("activity", "ViewStockPass");
            startActivityForResult(i, 13);
        //  fragment = new FragmentStockview();

            break;

        default:
            break;
        }
        checkfragment();

    }

    public void setTitle(CharSequence title) {
        mTitle = title;
        // getSupportActionBar().setTitle(mTitle);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("nzm", "TruckInventoryFragment");
        Log.d("nzm", "" + data + "requestCode" + requestCode);

        //super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
        case 11:
            if (data.getBooleanExtra("password", true)) {
                Log.d("nzm",
                        "onActivityResult:bolvalue"
                                + data.getBooleanExtra("password", true));

                fragment = new FragmentLoadOut();
                checkfragment();

            }

            break;

        case 12:
            if (data.getBooleanExtra("password", true)) {
                Log.d("nzm",
                        "onActivityResult:bolvalue"
                                + data.getBooleanExtra("password", true));

                fragment = new FragmentLoadtransfer();
                checkfragment();

            }
            break;
        case 13:
            if (data.getBooleanExtra("password", true)) {
                Log.d("nzm",
                        "onActivityResult:bolvalue"
                                + data.getBooleanExtra("password", true));

                fragment = new FragmentStockview();
                checkfragment();
            }
            break;
        default:
            break;

        }

    }

}

MY LOGCAT

   07-08 14:48:06.398: W/dalvikvm(22927): threadid=1: thread exiting with uncaught exception (group=0x40aac228)
07-08 14:48:06.418: E/AndroidRuntime(22927): FATAL EXCEPTION: main
07-08 14:48:06.418: E/AndroidRuntime(22927): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=131084, result=-1, data=Intent { (has extras) }} to activity {com.winwrench.pos/com.winwrench.pos.HomeActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3398)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3448)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.app.ActivityThread.access$1100(ActivityThread.java:139)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.os.Looper.loop(Looper.java:156)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.app.ActivityThread.main(ActivityThread.java:4987)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at java.lang.reflect.Method.invokeNative(Native Method)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at java.lang.reflect.Method.invoke(Method.java:511)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at dalvik.system.NativeStart.main(Native Method)
07-08 14:48:06.418: E/AndroidRuntime(22927): Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1343)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1361)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at com.winwrench.pos.fragments.TruckInventoryFragment.checkfragment(TruckInventoryFragment.java:132)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at com.winwrench.pos.fragments.TruckInventoryFragment.onActivityResult(TruckInventoryFragment.java:213)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:166)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at com.winwrench.pos.HomeActivity.onActivityResult(HomeActivity.java:390)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.app.Activity.dispatchActivityResult(Activity.java:4747)
07-08 14:48:06.418: E/AndroidRuntime(22927):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3394)
07-08 14:48:06.418: E/AndroidRuntime(22927):    ... 11 more

Upvotes: 1

Views: 1644

Answers (2)

Simas
Simas

Reputation: 44118

Change

fragmentManager.beginTransaction().
replace(R.id.truckinventory_form_fragmentgroup, fragment).commit();

to

fragmentManager.beginTransaction().
replace(R.id.truckinventory_form_fragmentgroup, fragment).commitAllowingStateLoss();

It's a known bug as is said said in this question.

Upvotes: 2

Hardik
Hardik

Reputation: 17441

you should check data!=null in onActivityResult. Replace below code with your onActvitiyResult and see.

@Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            Log.d("nzm", "TruckInventoryFragment");
            Log.d("nzm", "" + data + "requestCode" + requestCode);

            //super.onActivityResult(requestCode, resultCode, data);
            if(data==null)
            {
                  Log.d("nzm", "Failed to deliver result");
                  return;
            }


            switch (requestCode) {
            case 11:
                if (data.getBooleanExtra("password", true)) {
                    Log.d("nzm",
                            "onActivityResult:bolvalue"
                                    + data.getBooleanExtra("password", true));

                    fragment = new FragmentLoadOut();
                    checkfragment();

                }

                break;

            case 12:
                if (data.getBooleanExtra("password", true)) {
                    Log.d("nzm",
                            "onActivityResult:bolvalue"
                                    + data.getBooleanExtra("password", true));

                    fragment = new FragmentLoadtransfer();
                    checkfragment();

                }
                break;
            case 13:
                if (data.getBooleanExtra("password", true)) {
                    Log.d("nzm",
                            "onActivityResult:bolvalue"
                                    + data.getBooleanExtra("password", true));

                    fragment = new FragmentStockview();
                    checkfragment();
                }
                break;
            default:
                break;

            }

        }

Upvotes: 1

Related Questions