Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在手机上保存数据?_Android_Android Fragments_Transactions_Fragment_Onsaveinstancestate - Fatal编程技术网

Android 如何在手机上保存数据?

Android 如何在手机上保存数据?,android,android-fragments,transactions,fragment,onsaveinstancestate,Android,Android Fragments,Transactions,Fragment,Onsaveinstancestate,我很难让我的应用程序持久化。当我转动手机时,屏幕上的数据不会改变。但当我点击一个按钮来检索一个新片段后,我得到一个错误,上面写着“onSaveInstanceState之后不能执行此操作”。我在谷歌上搜索过,也看到过类似的问题,但我仍然不知道如何处理和解决这个问题 我有一个活动类、一个控制器类和两个片段类。 activity类有一个navigationviewer,其中有两个按钮可触发fragmenttransaction。也就是说,在每个按钮上单击它将用按钮侦听器中设置的片段替换当前片段。我的

我很难让我的应用程序持久化。当我转动手机时,屏幕上的数据不会改变。但当我点击一个按钮来检索一个新片段后,我得到一个错误,上面写着“onSaveInstanceState之后不能执行此操作”。我在谷歌上搜索过,也看到过类似的问题,但我仍然不知道如何处理和解决这个问题

我有一个活动类、一个控制器类和两个片段类。 activity类有一个navigationviewer,其中有两个按钮可触发fragmenttransaction。也就是说,在每个按钮上单击它将用按钮侦听器中设置的片段替换当前片段。我的控制器类初始化系统,而片段只是UI

我的活动课

public class LoggedInActivity extends AppCompatActivity {
    private final String TAG = "LoggedInActivity: ";
    private Controller controller;
    private TextView navName;
    private NavigationView navigationView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.v(TAG, "onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logged_in);
        if(savedInstanceState == null) {
            Log.v(TAG, "savedInstanceState == null");
            initComponents();
            setNavName();
            initListener();
            initializeSystem();
        } else {
            Log.v(TAG, "savedInstanceState != null");
            initComponents();
            setNavName();
            initListener();
            this.controller = (Controller)savedInstanceState.getSerializable("controller");
        }
    }


    private void initComponents() {
        navigationView = (NavigationView) findViewById(R.id.navigation_view);
        View headerView = navigationView.getHeaderView(0);
        navName = (TextView) headerView.findViewById(R.id.tv_name_surname);

    }

    private void initListener() {
        navigationView.setNavigationItemSelectedListener(new MyNavigationItemListener());
    }

    private void initializeSystem() {
        Log.v(TAG, "new controller");
        controller = new Controller(this, null);
    }

    public void setFragment(Fragment fragment) {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container_logged_in, fragment).commit();
    }



    private class MyNavigationItemListener implements NavigationView.OnNavigationItemSelectedListener {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch(item.getItemId()) {

                case R.id.drawer_summary:
                    controller.setFragmentSummary();
                    break;

                case R.id.drawer_income:
                    controller.setFragmentIncome();
                    break;
            }
            return false;
        }
    }


    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putSerializable("controller", controller);
        super.onSaveInstanceState(outState);
        Log.v(TAG, "onSaveInstanceState, saving the controller");
    }

}
public class Controller implements Serializable {
    private final String TAG = "Controller: ";

    /********************** Fragments ***********************/
    private Fragment_Income fragment_income;
    private Fragment_Summary fragment_summary;
    /********************************************************/

    /********************** Activities **********************/
    private LoggedInActivity logged_in_activity;
    /********************************************************/


    public Controller(LoggedInActivity logged_in_activity) {
        this.logged_in_activity = logged_in_activity;
        initLoggedInFragments();
        setFragmentSummary();

        }
    }



    /* Initializes fragments that are connected to LoggedInActivity */
    private void initLoggedInFragments() {
        fragment_income = new Fragment_Income();
        fragment_income.setController(this);
        fragment_summary = new Fragment_Summary();
        fragment_summary.setController(this);
    }



    /* use to replace current fragment with the given one */
    private void replaceFragmentWith(Fragment fragment) {
        logged_in_activity.setFragment(fragment);
    }



    /***********************************************************
     *          METHODS REGARDING FRAGMENT INCOME              *
     **********************************************************/

    public void setFragmentIncome() {
        replaceFragmentWith(fragment_income);
    }


    /* Summary fragment is started at first */
    public void setFragmentSummary() {
        replaceFragmentWith(fragment_summary);
    }

}
public class Fragment_Income extends Fragment implements Serializable{
    private final String TAG = "Fragment_Income: ";
    private Controller controller;
    private FloatingActionButton fab_income;
    private ListView lv_income;
    private ArrayList<LvData> incomeData;
    private LvAdapterIncome lvAdapterIncome;

    public Fragment_Income() {

    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.v(TAG, "onCreateView");
        View view = inflater.inflate(R.layout.fragment_income, container, false); // Inflate the layout for this fragment
        if(savedInstanceState != null) {
            this.controller = (Controller) savedInstanceState.getSerializable("controller");
        }
        initComponents(view);
        initListener();
        setupListView();
        return view;
    }

    private void initComponents(View view) {
        fab_income = (FloatingActionButton) view.findViewById(R.id.fab_income);
        lv_income = (ListView) view.findViewById(R.id.lv_income);
    }


    private void initListener() {
        ButtonListener buttonListener = new ButtonListener();
        fab_income.setOnClickListener(buttonListener);
    }

    private void setupListView() {
        if (incomeData == null) { // checks if incomeData have been initalized before, if so do not change array to defualt
            incomeData = new ArrayList<>();
            lvAdapterIncome = new LvAdapterIncome(getContext(), incomeData);
        }
        lv_income.setAdapter(lvAdapterIncome);

    }


    public void setController(Controller controller) {
        this.controller = controller;
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        Log.v(TAG, "onSaveInstanceState, saving the controller");
        outState.putSerializable("controller", this.controller);
        super.onSaveInstanceState(outState);
    }

}
public class Fragment_Summary extends Fragment implements Serializable {
    private static final String TAG = "Fragment_Summary: ";
    private Controller controller;
    private TextView tv_user;
    private TextView tv_total_revenue;
    private TextView tv_total_expenditure;
    private TextView tv_balance;
    private float totalRevenue;
    private float totalExpenditure;
    private float balance;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_summary, container, false);// Inflate the layout for this fragment
        initComponents(view);
        setUserName();
        if(savedInstanceState == null) {
            //DO SOMETHING
        }
        return view;
    }

    private void addData() {
        totalRevenue = controller.getTotalRevenue();
        totalExpenditure = controller.getTotalExpenditure();
        balance = totalRevenue - totalExpenditure;

        tv_total_revenue.setText(String.valueOf(totalRevenue));
        tv_total_expenditure.setText(String.valueOf(totalExpenditure));
        tv_balance.setText(String.valueOf(balance));
    }

    private void initComponents(View view) {
        tv_user = (TextView)view.findViewById(R.id.tv_user);
        tv_total_revenue = (TextView)view.findViewById(R.id.tv_revenue);
        tv_total_expenditure = (TextView)view.findViewById(R.id.tv_sum_exp);
        tv_balance = (TextView)view.findViewById(R.id.tv_balance);
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putString("revenue", String.valueOf(balance));
        outState.putString("totalExpenditure", String.valueOf(balance));
        outState.putString("balance", String.valueOf(balance));
        super.onSaveInstanceState(outState);
    }


    public void setController(Controller controller) {
        this.controller = controller;
    }

}
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1434)
    at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1452)
    at android.app.BackStackRecord.commitInternal(BackStackRecord.java:708)
    at android.app.BackStackRecord.commit(BackStackRecord.java:672)
    at com.example.user.my_app.LoggedInActivity.setFragment(LoggedInActivity.java:85)
    at com.example.user.my_app.Controller.replaceFragmentWith(Controller.java:89)
    at com.example.user.my_app.Controller.setFragmentIncome(Controller.java:99)
    at com.example.user.my_app.LoggedInActivity$MyNavigationItemListener.onNavigationItemSelected(LoggedInActivity.java:127)
    at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:156)
    at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
    at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:156)
    at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:969)
    at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:342)
    at android.view.View.performClick(View.java:5637)
    at android.view.View$PerformClick.run(View.java:22429)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
我的控制器类

public class LoggedInActivity extends AppCompatActivity {
    private final String TAG = "LoggedInActivity: ";
    private Controller controller;
    private TextView navName;
    private NavigationView navigationView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.v(TAG, "onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logged_in);
        if(savedInstanceState == null) {
            Log.v(TAG, "savedInstanceState == null");
            initComponents();
            setNavName();
            initListener();
            initializeSystem();
        } else {
            Log.v(TAG, "savedInstanceState != null");
            initComponents();
            setNavName();
            initListener();
            this.controller = (Controller)savedInstanceState.getSerializable("controller");
        }
    }


    private void initComponents() {
        navigationView = (NavigationView) findViewById(R.id.navigation_view);
        View headerView = navigationView.getHeaderView(0);
        navName = (TextView) headerView.findViewById(R.id.tv_name_surname);

    }

    private void initListener() {
        navigationView.setNavigationItemSelectedListener(new MyNavigationItemListener());
    }

    private void initializeSystem() {
        Log.v(TAG, "new controller");
        controller = new Controller(this, null);
    }

    public void setFragment(Fragment fragment) {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container_logged_in, fragment).commit();
    }



    private class MyNavigationItemListener implements NavigationView.OnNavigationItemSelectedListener {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch(item.getItemId()) {

                case R.id.drawer_summary:
                    controller.setFragmentSummary();
                    break;

                case R.id.drawer_income:
                    controller.setFragmentIncome();
                    break;
            }
            return false;
        }
    }


    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putSerializable("controller", controller);
        super.onSaveInstanceState(outState);
        Log.v(TAG, "onSaveInstanceState, saving the controller");
    }

}
public class Controller implements Serializable {
    private final String TAG = "Controller: ";

    /********************** Fragments ***********************/
    private Fragment_Income fragment_income;
    private Fragment_Summary fragment_summary;
    /********************************************************/

    /********************** Activities **********************/
    private LoggedInActivity logged_in_activity;
    /********************************************************/


    public Controller(LoggedInActivity logged_in_activity) {
        this.logged_in_activity = logged_in_activity;
        initLoggedInFragments();
        setFragmentSummary();

        }
    }



    /* Initializes fragments that are connected to LoggedInActivity */
    private void initLoggedInFragments() {
        fragment_income = new Fragment_Income();
        fragment_income.setController(this);
        fragment_summary = new Fragment_Summary();
        fragment_summary.setController(this);
    }



    /* use to replace current fragment with the given one */
    private void replaceFragmentWith(Fragment fragment) {
        logged_in_activity.setFragment(fragment);
    }



    /***********************************************************
     *          METHODS REGARDING FRAGMENT INCOME              *
     **********************************************************/

    public void setFragmentIncome() {
        replaceFragmentWith(fragment_income);
    }


    /* Summary fragment is started at first */
    public void setFragmentSummary() {
        replaceFragmentWith(fragment_summary);
    }

}
public class Fragment_Income extends Fragment implements Serializable{
    private final String TAG = "Fragment_Income: ";
    private Controller controller;
    private FloatingActionButton fab_income;
    private ListView lv_income;
    private ArrayList<LvData> incomeData;
    private LvAdapterIncome lvAdapterIncome;

    public Fragment_Income() {

    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.v(TAG, "onCreateView");
        View view = inflater.inflate(R.layout.fragment_income, container, false); // Inflate the layout for this fragment
        if(savedInstanceState != null) {
            this.controller = (Controller) savedInstanceState.getSerializable("controller");
        }
        initComponents(view);
        initListener();
        setupListView();
        return view;
    }

    private void initComponents(View view) {
        fab_income = (FloatingActionButton) view.findViewById(R.id.fab_income);
        lv_income = (ListView) view.findViewById(R.id.lv_income);
    }


    private void initListener() {
        ButtonListener buttonListener = new ButtonListener();
        fab_income.setOnClickListener(buttonListener);
    }

    private void setupListView() {
        if (incomeData == null) { // checks if incomeData have been initalized before, if so do not change array to defualt
            incomeData = new ArrayList<>();
            lvAdapterIncome = new LvAdapterIncome(getContext(), incomeData);
        }
        lv_income.setAdapter(lvAdapterIncome);

    }


    public void setController(Controller controller) {
        this.controller = controller;
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        Log.v(TAG, "onSaveInstanceState, saving the controller");
        outState.putSerializable("controller", this.controller);
        super.onSaveInstanceState(outState);
    }

}
public class Fragment_Summary extends Fragment implements Serializable {
    private static final String TAG = "Fragment_Summary: ";
    private Controller controller;
    private TextView tv_user;
    private TextView tv_total_revenue;
    private TextView tv_total_expenditure;
    private TextView tv_balance;
    private float totalRevenue;
    private float totalExpenditure;
    private float balance;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_summary, container, false);// Inflate the layout for this fragment
        initComponents(view);
        setUserName();
        if(savedInstanceState == null) {
            //DO SOMETHING
        }
        return view;
    }

    private void addData() {
        totalRevenue = controller.getTotalRevenue();
        totalExpenditure = controller.getTotalExpenditure();
        balance = totalRevenue - totalExpenditure;

        tv_total_revenue.setText(String.valueOf(totalRevenue));
        tv_total_expenditure.setText(String.valueOf(totalExpenditure));
        tv_balance.setText(String.valueOf(balance));
    }

    private void initComponents(View view) {
        tv_user = (TextView)view.findViewById(R.id.tv_user);
        tv_total_revenue = (TextView)view.findViewById(R.id.tv_revenue);
        tv_total_expenditure = (TextView)view.findViewById(R.id.tv_sum_exp);
        tv_balance = (TextView)view.findViewById(R.id.tv_balance);
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putString("revenue", String.valueOf(balance));
        outState.putString("totalExpenditure", String.valueOf(balance));
        outState.putString("balance", String.valueOf(balance));
        super.onSaveInstanceState(outState);
    }


    public void setController(Controller controller) {
        this.controller = controller;
    }

}
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1434)
    at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1452)
    at android.app.BackStackRecord.commitInternal(BackStackRecord.java:708)
    at android.app.BackStackRecord.commit(BackStackRecord.java:672)
    at com.example.user.my_app.LoggedInActivity.setFragment(LoggedInActivity.java:85)
    at com.example.user.my_app.Controller.replaceFragmentWith(Controller.java:89)
    at com.example.user.my_app.Controller.setFragmentIncome(Controller.java:99)
    at com.example.user.my_app.LoggedInActivity$MyNavigationItemListener.onNavigationItemSelected(LoggedInActivity.java:127)
    at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:156)
    at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
    at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:156)
    at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:969)
    at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:342)
    at android.view.View.performClick(View.java:5637)
    at android.view.View$PerformClick.run(View.java:22429)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
部分收入

public class LoggedInActivity extends AppCompatActivity {
    private final String TAG = "LoggedInActivity: ";
    private Controller controller;
    private TextView navName;
    private NavigationView navigationView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.v(TAG, "onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logged_in);
        if(savedInstanceState == null) {
            Log.v(TAG, "savedInstanceState == null");
            initComponents();
            setNavName();
            initListener();
            initializeSystem();
        } else {
            Log.v(TAG, "savedInstanceState != null");
            initComponents();
            setNavName();
            initListener();
            this.controller = (Controller)savedInstanceState.getSerializable("controller");
        }
    }


    private void initComponents() {
        navigationView = (NavigationView) findViewById(R.id.navigation_view);
        View headerView = navigationView.getHeaderView(0);
        navName = (TextView) headerView.findViewById(R.id.tv_name_surname);

    }

    private void initListener() {
        navigationView.setNavigationItemSelectedListener(new MyNavigationItemListener());
    }

    private void initializeSystem() {
        Log.v(TAG, "new controller");
        controller = new Controller(this, null);
    }

    public void setFragment(Fragment fragment) {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container_logged_in, fragment).commit();
    }



    private class MyNavigationItemListener implements NavigationView.OnNavigationItemSelectedListener {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch(item.getItemId()) {

                case R.id.drawer_summary:
                    controller.setFragmentSummary();
                    break;

                case R.id.drawer_income:
                    controller.setFragmentIncome();
                    break;
            }
            return false;
        }
    }


    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putSerializable("controller", controller);
        super.onSaveInstanceState(outState);
        Log.v(TAG, "onSaveInstanceState, saving the controller");
    }

}
public class Controller implements Serializable {
    private final String TAG = "Controller: ";

    /********************** Fragments ***********************/
    private Fragment_Income fragment_income;
    private Fragment_Summary fragment_summary;
    /********************************************************/

    /********************** Activities **********************/
    private LoggedInActivity logged_in_activity;
    /********************************************************/


    public Controller(LoggedInActivity logged_in_activity) {
        this.logged_in_activity = logged_in_activity;
        initLoggedInFragments();
        setFragmentSummary();

        }
    }



    /* Initializes fragments that are connected to LoggedInActivity */
    private void initLoggedInFragments() {
        fragment_income = new Fragment_Income();
        fragment_income.setController(this);
        fragment_summary = new Fragment_Summary();
        fragment_summary.setController(this);
    }



    /* use to replace current fragment with the given one */
    private void replaceFragmentWith(Fragment fragment) {
        logged_in_activity.setFragment(fragment);
    }



    /***********************************************************
     *          METHODS REGARDING FRAGMENT INCOME              *
     **********************************************************/

    public void setFragmentIncome() {
        replaceFragmentWith(fragment_income);
    }


    /* Summary fragment is started at first */
    public void setFragmentSummary() {
        replaceFragmentWith(fragment_summary);
    }

}
public class Fragment_Income extends Fragment implements Serializable{
    private final String TAG = "Fragment_Income: ";
    private Controller controller;
    private FloatingActionButton fab_income;
    private ListView lv_income;
    private ArrayList<LvData> incomeData;
    private LvAdapterIncome lvAdapterIncome;

    public Fragment_Income() {

    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.v(TAG, "onCreateView");
        View view = inflater.inflate(R.layout.fragment_income, container, false); // Inflate the layout for this fragment
        if(savedInstanceState != null) {
            this.controller = (Controller) savedInstanceState.getSerializable("controller");
        }
        initComponents(view);
        initListener();
        setupListView();
        return view;
    }

    private void initComponents(View view) {
        fab_income = (FloatingActionButton) view.findViewById(R.id.fab_income);
        lv_income = (ListView) view.findViewById(R.id.lv_income);
    }


    private void initListener() {
        ButtonListener buttonListener = new ButtonListener();
        fab_income.setOnClickListener(buttonListener);
    }

    private void setupListView() {
        if (incomeData == null) { // checks if incomeData have been initalized before, if so do not change array to defualt
            incomeData = new ArrayList<>();
            lvAdapterIncome = new LvAdapterIncome(getContext(), incomeData);
        }
        lv_income.setAdapter(lvAdapterIncome);

    }


    public void setController(Controller controller) {
        this.controller = controller;
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        Log.v(TAG, "onSaveInstanceState, saving the controller");
        outState.putSerializable("controller", this.controller);
        super.onSaveInstanceState(outState);
    }

}
public class Fragment_Summary extends Fragment implements Serializable {
    private static final String TAG = "Fragment_Summary: ";
    private Controller controller;
    private TextView tv_user;
    private TextView tv_total_revenue;
    private TextView tv_total_expenditure;
    private TextView tv_balance;
    private float totalRevenue;
    private float totalExpenditure;
    private float balance;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_summary, container, false);// Inflate the layout for this fragment
        initComponents(view);
        setUserName();
        if(savedInstanceState == null) {
            //DO SOMETHING
        }
        return view;
    }

    private void addData() {
        totalRevenue = controller.getTotalRevenue();
        totalExpenditure = controller.getTotalExpenditure();
        balance = totalRevenue - totalExpenditure;

        tv_total_revenue.setText(String.valueOf(totalRevenue));
        tv_total_expenditure.setText(String.valueOf(totalExpenditure));
        tv_balance.setText(String.valueOf(balance));
    }

    private void initComponents(View view) {
        tv_user = (TextView)view.findViewById(R.id.tv_user);
        tv_total_revenue = (TextView)view.findViewById(R.id.tv_revenue);
        tv_total_expenditure = (TextView)view.findViewById(R.id.tv_sum_exp);
        tv_balance = (TextView)view.findViewById(R.id.tv_balance);
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putString("revenue", String.valueOf(balance));
        outState.putString("totalExpenditure", String.valueOf(balance));
        outState.putString("balance", String.valueOf(balance));
        super.onSaveInstanceState(outState);
    }


    public void setController(Controller controller) {
        this.controller = controller;
    }

}
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1434)
    at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1452)
    at android.app.BackStackRecord.commitInternal(BackStackRecord.java:708)
    at android.app.BackStackRecord.commit(BackStackRecord.java:672)
    at com.example.user.my_app.LoggedInActivity.setFragment(LoggedInActivity.java:85)
    at com.example.user.my_app.Controller.replaceFragmentWith(Controller.java:89)
    at com.example.user.my_app.Controller.setFragmentIncome(Controller.java:99)
    at com.example.user.my_app.LoggedInActivity$MyNavigationItemListener.onNavigationItemSelected(LoggedInActivity.java:127)
    at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:156)
    at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
    at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:156)
    at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:969)
    at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:342)
    at android.view.View.performClick(View.java:5637)
    at android.view.View$PerformClick.run(View.java:22429)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
我已从类中删除了所有头文件和一些方法,因为我认为它们与此问题无关。

这是错误日志

public class LoggedInActivity extends AppCompatActivity {
    private final String TAG = "LoggedInActivity: ";
    private Controller controller;
    private TextView navName;
    private NavigationView navigationView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.v(TAG, "onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logged_in);
        if(savedInstanceState == null) {
            Log.v(TAG, "savedInstanceState == null");
            initComponents();
            setNavName();
            initListener();
            initializeSystem();
        } else {
            Log.v(TAG, "savedInstanceState != null");
            initComponents();
            setNavName();
            initListener();
            this.controller = (Controller)savedInstanceState.getSerializable("controller");
        }
    }


    private void initComponents() {
        navigationView = (NavigationView) findViewById(R.id.navigation_view);
        View headerView = navigationView.getHeaderView(0);
        navName = (TextView) headerView.findViewById(R.id.tv_name_surname);

    }

    private void initListener() {
        navigationView.setNavigationItemSelectedListener(new MyNavigationItemListener());
    }

    private void initializeSystem() {
        Log.v(TAG, "new controller");
        controller = new Controller(this, null);
    }

    public void setFragment(Fragment fragment) {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container_logged_in, fragment).commit();
    }



    private class MyNavigationItemListener implements NavigationView.OnNavigationItemSelectedListener {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch(item.getItemId()) {

                case R.id.drawer_summary:
                    controller.setFragmentSummary();
                    break;

                case R.id.drawer_income:
                    controller.setFragmentIncome();
                    break;
            }
            return false;
        }
    }


    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putSerializable("controller", controller);
        super.onSaveInstanceState(outState);
        Log.v(TAG, "onSaveInstanceState, saving the controller");
    }

}
public class Controller implements Serializable {
    private final String TAG = "Controller: ";

    /********************** Fragments ***********************/
    private Fragment_Income fragment_income;
    private Fragment_Summary fragment_summary;
    /********************************************************/

    /********************** Activities **********************/
    private LoggedInActivity logged_in_activity;
    /********************************************************/


    public Controller(LoggedInActivity logged_in_activity) {
        this.logged_in_activity = logged_in_activity;
        initLoggedInFragments();
        setFragmentSummary();

        }
    }



    /* Initializes fragments that are connected to LoggedInActivity */
    private void initLoggedInFragments() {
        fragment_income = new Fragment_Income();
        fragment_income.setController(this);
        fragment_summary = new Fragment_Summary();
        fragment_summary.setController(this);
    }



    /* use to replace current fragment with the given one */
    private void replaceFragmentWith(Fragment fragment) {
        logged_in_activity.setFragment(fragment);
    }



    /***********************************************************
     *          METHODS REGARDING FRAGMENT INCOME              *
     **********************************************************/

    public void setFragmentIncome() {
        replaceFragmentWith(fragment_income);
    }


    /* Summary fragment is started at first */
    public void setFragmentSummary() {
        replaceFragmentWith(fragment_summary);
    }

}
public class Fragment_Income extends Fragment implements Serializable{
    private final String TAG = "Fragment_Income: ";
    private Controller controller;
    private FloatingActionButton fab_income;
    private ListView lv_income;
    private ArrayList<LvData> incomeData;
    private LvAdapterIncome lvAdapterIncome;

    public Fragment_Income() {

    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.v(TAG, "onCreateView");
        View view = inflater.inflate(R.layout.fragment_income, container, false); // Inflate the layout for this fragment
        if(savedInstanceState != null) {
            this.controller = (Controller) savedInstanceState.getSerializable("controller");
        }
        initComponents(view);
        initListener();
        setupListView();
        return view;
    }

    private void initComponents(View view) {
        fab_income = (FloatingActionButton) view.findViewById(R.id.fab_income);
        lv_income = (ListView) view.findViewById(R.id.lv_income);
    }


    private void initListener() {
        ButtonListener buttonListener = new ButtonListener();
        fab_income.setOnClickListener(buttonListener);
    }

    private void setupListView() {
        if (incomeData == null) { // checks if incomeData have been initalized before, if so do not change array to defualt
            incomeData = new ArrayList<>();
            lvAdapterIncome = new LvAdapterIncome(getContext(), incomeData);
        }
        lv_income.setAdapter(lvAdapterIncome);

    }


    public void setController(Controller controller) {
        this.controller = controller;
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        Log.v(TAG, "onSaveInstanceState, saving the controller");
        outState.putSerializable("controller", this.controller);
        super.onSaveInstanceState(outState);
    }

}
public class Fragment_Summary extends Fragment implements Serializable {
    private static final String TAG = "Fragment_Summary: ";
    private Controller controller;
    private TextView tv_user;
    private TextView tv_total_revenue;
    private TextView tv_total_expenditure;
    private TextView tv_balance;
    private float totalRevenue;
    private float totalExpenditure;
    private float balance;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_summary, container, false);// Inflate the layout for this fragment
        initComponents(view);
        setUserName();
        if(savedInstanceState == null) {
            //DO SOMETHING
        }
        return view;
    }

    private void addData() {
        totalRevenue = controller.getTotalRevenue();
        totalExpenditure = controller.getTotalExpenditure();
        balance = totalRevenue - totalExpenditure;

        tv_total_revenue.setText(String.valueOf(totalRevenue));
        tv_total_expenditure.setText(String.valueOf(totalExpenditure));
        tv_balance.setText(String.valueOf(balance));
    }

    private void initComponents(View view) {
        tv_user = (TextView)view.findViewById(R.id.tv_user);
        tv_total_revenue = (TextView)view.findViewById(R.id.tv_revenue);
        tv_total_expenditure = (TextView)view.findViewById(R.id.tv_sum_exp);
        tv_balance = (TextView)view.findViewById(R.id.tv_balance);
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putString("revenue", String.valueOf(balance));
        outState.putString("totalExpenditure", String.valueOf(balance));
        outState.putString("balance", String.valueOf(balance));
        super.onSaveInstanceState(outState);
    }


    public void setController(Controller controller) {
        this.controller = controller;
    }

}
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1434)
    at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1452)
    at android.app.BackStackRecord.commitInternal(BackStackRecord.java:708)
    at android.app.BackStackRecord.commit(BackStackRecord.java:672)
    at com.example.user.my_app.LoggedInActivity.setFragment(LoggedInActivity.java:85)
    at com.example.user.my_app.Controller.replaceFragmentWith(Controller.java:89)
    at com.example.user.my_app.Controller.setFragmentIncome(Controller.java:99)
    at com.example.user.my_app.LoggedInActivity$MyNavigationItemListener.onNavigationItemSelected(LoggedInActivity.java:127)
    at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:156)
    at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
    at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:156)
    at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:969)
    at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:342)
    at android.view.View.performClick(View.java:5637)
    at android.view.View$PerformClick.run(View.java:22429)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

这看起来像是活动状态丢失。请参阅Alex Lockwood的这篇优秀文章,标题为。我一再提到它

要引用帖子的简介:

自Honeycomb首次发布以来,以下堆栈跟踪和异常消息一直困扰着StackOverflow:

本文将解释引发此异常的原因和时间,并给出一些建议,以确保它不会再次使应用程序崩溃


尝试使用
getSupportFragmentManager()
而不是
getFragmentManager()
,因为您使用的是
AppCompatActivity
没有帮助,不过谢谢您的回答。我发现奇怪的是,当我将commit()更改为commitAllowingStateLoss()时,代码给出了以下错误“IllegalStateException:活动已被销毁”。但是,如果它是在onCreate方法中创建的,那么如何销毁它呢?