2

编辑:添加onPause()and后onResume(),应用程序不再崩溃;但是,该实例仍未保存,并且我丢失了放入EditText. 我推测我应该使用onPause(),保存实例,并使用(或者可能使用 thisonStop()一起使用)来调用它- 我现在正在阅读如何使用这三种方法,我将不胜感激任何指针。onResume() onSaveInstanceState(), onRestoreInstanceState()

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

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

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

这是后退按钮的代码

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为文本 fromedCourse1.getText()+""等,然后onRestoreInstanceState()将恢复String内部edC1toedCourse1等等。

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

4

2 回答 2

1

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

让我知道这是否有帮助。

于 2016-12-11T12:20:44.020 回答
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()andonStop()用于将EditText字段内的文本保存到顶部初始化的文件中。onResume()用于调用保存的文本并将它们应用到相关字段EditTextonSaveInstanceState()用于保存状态,用于onRestoreInstanceState()在崩溃时恢复状态。if else中的,onCreate()用于确定是否存在要恢复的先前状态(通过onStop),并且根据此条件调用/初始化值。

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

于 2016-12-11T14:19:37.657 回答