编辑:添加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
将为按钮添加名称并使其可见。我推测我将遇到的问题是:当重新启动应用程序时,所有按钮都将变为不可见。
答案 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
),并且调用/初始化值视这种情况而定。
希望这可以帮助有类似问题的人!