实施savedInstanceState后,Android应用程序停止

时间:2016-12-11 10:29:34

标签: java android android-edittext onrestoreinstancestate onsaveinstancestate

编辑:添加onPause()onResume()后,该应用不再崩溃;但是,实例仍然没有保存,我丢失了EditText中的文本。我推测我应该使用onPause()onStop()保存实例,并使用onResume()调用它(或者使用此 {{ 1}}}} - 我现在正在阅读如何使用这三种方法,我将不胜感激。

我目前正在编写一个只有四(可能是五个)活动的简单Android应用程序。该应用程序的功能是为大学的学生提供帮助和建议,他们需要自己添加课程(显示在onSaveInstanceState(), onRestoreInstanceState()页面上作为按钮) - 当按下按钮时,它将带学生到建议页面。

我目前正在处理的是课程添加页面:activity_main_page。我在尝试添加一种方法来保存活动暂停/停止时保存activity_add_course文本的状态(这是用户添加课程名称的位置)(例如,当用户按下后退按钮或主页按钮),并在用户返回页面时调用它。

在尝试将实例状态保存添加到应用程序之前,应用程序运行良好(使用虚拟意图连接活动 - 我还没有添加SQL数据库以实际使应用程序正常工作)。现在我已经添加了实例状态保存和调用,当我单击后退按钮时,应用程序停止运行,我不明白为什么?或者如何修复它? - 这个问题已经解决了。谢谢@peresisUser

这是后退按钮的代码

EditText

这些是我用来保存和恢复的代码。

btBk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent New = new Intent(AddCourse.this, MainPage.class);
                startActivity(New);
            }
        });
    }

public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); //Save instance state savedInstanceState.putString("edC1", edCourse1.getText()+""); savedInstanceState.putString("edC2", edCourse2.getText()+""); savedInstanceState.putString("edC3", edCourse3.getText()+""); savedInstanceState.putString("edC4", edCourse4.getText()+""); } public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); //Restore instance state String edC1 = savedInstanceState.getString("edC1"); edCourse1.setText(edC1+""); String edC2 = savedInstanceState.getString("edC2"); edCourse2.setText(edC2+""); String edC3 = savedInstanceState.getString("edC3"); edCourse3.setText(edC3+""); String edC4 = savedInstanceState.getString("edC4"); edCourse4.setText(edC4+""); } 不同edCourse1-4

根据我的理解,EditTexts会将onSaveInstanceState()保存为来自edC1的文字,依此类推,然后edCourse1.getText()+""将恢复onRestoreInstanceState()内{ {1}}到String等等。

遇到麻烦,我不知道如何解决我的下一个问题,即必须保存页面edC1上的按钮状态。在这里,我将有10个按钮,它们以隐形和无名开始,其中edCourse1将为按钮添加名称并使其可见。我推测我将遇到的问题是:当重新启动应用程序时,所有按钮都将变为不可见。

2 个答案:

答案 0 :(得分:1)

在我看来,您应该只在onPause()中添加超级调用,这可能会在您的代码中被删除。 堆栈跟踪的第一行: android.util.SuperNotCalledException:Activity {com.example.user.icecres / com.example.user.icecres.AddCourse}没有调用super.onPause()

如果有帮助,请告诉我。

答案 1 :(得分:1)

所以我已经想出了如何完成所有这些,下一个任务:为按钮做同样的事情!

随意添加/编辑适合此答案的任何内容。

这是我的最终源代码:

package com.example.user.icecres;

import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.view.View;

public class AddCourse extends AppCompatActivity {
    private EditText edCourse1, edCourse2, edCourse3,edCourse4;
    private Button btConfirm, btReset, btBk;
    public static final String PREFS_NAME = "MyPrefsFile";

    @Override
    protected void onCreate(Bundle state) {
        super.onCreate(state);
        setContentView(R.layout.activity_add_course);

       if(state != null){
           //restore state onStop()
           SharedPreferences pText = getSharedPreferences(PREFS_NAME,0);
           String edC1 = pText.getString("edC1", "");
           String edC2 = pText.getString("edC2", "");
           String edC3 = pText.getString("edC3", "");
           String edC4 = pText.getString("edC4", "");

           edCourse1.setText(edC1);
           edCourse2.setText(edC2);
           edCourse3.setText(edC3);
           edCourse4.setText(edC4);


        } else {

            btConfirm = (Button) findViewById(R.id.btConfirm);
            btReset = (Button) findViewById(R.id.btReset);

            edCourse1 = (EditText) findViewById(R.id.edCourse1);
            edCourse2 = (EditText) findViewById(R.id.edCourse2);
            edCourse3 = (EditText) findViewById(R.id.edCourse3);
            edCourse4 = (EditText) findViewById(R.id.edCourse4);

            btBk = (Button) findViewById(R.id.btBk);
        }

        btConfirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // add course to database
                edCourse1.setText("");
                edCourse2.setText("");
                edCourse3.setText("");
                edCourse4.setText("");
                AlertDialog.Builder d = new AlertDialog.Builder(
                        AddCourse.this);
                d.setTitle("Success");
                d.setMessage("Courses have been added");
                d.setPositiveButton("OK", null);


            }

        });
        btReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder c = new AlertDialog.Builder(
                        AddCourse.this);
                c.setTitle("Confirmation");
                c.setMessage("Would you like to clear all fields?");
                c.setPositiveButton("YES", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        edCourse1.setText("");
                        edCourse2.setText("");
                        edCourse3.setText("");
                        edCourse4.setText("");
                    }
                });
                c.setNegativeButton("NO",null);
                c.show();
            }

        });
        btBk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent New = new Intent(AddCourse.this, MainPage.class);
                startActivity(New);
            }
        });
    }

    @Override
    protected void onPause() {
        super.onPause();

        SharedPreferences pText = getSharedPreferences(PREFS_NAME, 0);
        SharedPreferences.Editor edit = pText.edit();
        edit.putString("edC1",edCourse1.getText()+"");
        edit.putString("edC2",edCourse2.getText()+"");
        edit.putString("edC3",edCourse3.getText()+"");
        edit.putString("edC4",edCourse4.getText()+"");

        edit.commit();


    }

    @Override
    protected void onStop() {
        super.onStop();

        SharedPreferences pText = getSharedPreferences(PREFS_NAME, 0);
        SharedPreferences.Editor edit = pText.edit();
        edit.putString("edC1",edCourse1.getText()+"");
        edit.putString("edC2",edCourse2.getText()+"");
        edit.putString("edC3",edCourse3.getText()+"");
        edit.putString("edC4",edCourse4.getText()+"");

        edit.commit();

    }

    @Override
    protected void onResume() {
        super.onResume();

        SharedPreferences pText = getSharedPreferences(PREFS_NAME,0);
        String edC1 = pText.getString("edC1", "");
        String edC2 = pText.getString("edC2", "");
        String edC3 = pText.getString("edC3", "");
        String edC4 = pText.getString("edC4", "");

        edCourse1.setText(edC1);
        edCourse2.setText(edC2);
        edCourse3.setText(edC3);
        edCourse4.setText(edC4);

    }

    protected void onSaveInstanceState(Bundle state) {
        super.onSaveInstanceState(state);
        //Save instance state
        state.putString("edC1", edCourse1.getText()+"");
        state.putString("edC2", edCourse2.getText()+"");
        state.putString("edC3", edCourse3.getText()+"");
        state.putString("edC4", edCourse4.getText()+"");


    }
    protected void onRestoreInstanceState(Bundle state) {
        super.onRestoreInstanceState(state);
        //Restore instance state on crash
        String edC1 = state.getString("edC1","");
        String edC2 = state.getString("edC2","");
        String edC3 = state.getString("edC3","");
        String edC4 = state.getString("edC4","");
        edCourse2.setText(edC2+"");
        edCourse3.setText(edC3+"");
        edCourse1.setText(edC1+"");
        edCourse4.setText(edC4+"");
    }
}

因此onPause()onStop()用于将EditText字段中的文本保存到顶部初始化的文件中。 onResume()用于调用已保存的文本并将其应用于相关的EditText字段。 onSaveInstanceState()用于保存状态,onRestoreInstanceState()用于恢复崩溃状态。 if中的else onCreate()用于确定是否存在要恢复的先前状态(onStop),并且调用/初始化值视这种情况而定。

希望这可以帮助有类似问题的人!