Android-приложение останавливается после реализации saveInstanceState
РЕДАКТИРОВАТЬ: после добавления onPause()
а также onResume()
приложение больше не падает; однако экземпляр по-прежнему не сохраняется, и я теряю текст, помещенный в EditText
, Я предполагаю, что я должен сохранить экземпляр, используя onPause()
, onStop()
и вспомнить его, используя 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
как текст из edCourse1.getText()+""
и так далее, то onRestoreInstanceState()
восстановит String
внутри edC1
в edCourse1
и так далее.
Возникли проблемы с этим, я понятия не имею, как мне решить мою следующую проблему, которая должна сохранить состояние кнопок на странице activity_main_page
, Здесь у меня будет 10 кнопок, которые начинаются как невидимые и безымянные, где activity_add_course
добавит имя к кнопке и сделает его видимым. Я предполагаю, что проблема, с которой я столкнусь, заключается в том, что все кнопки станут невидимыми при перезапуске приложения.
2 ответа
Итак, я понял, как сделать все это, следующее задание: сделать то же самое для кнопок!
Не стесняйтесь добавлять / редактировать все, что подходит к этому ответу.
Это мой последний исходный код:
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
), и значения вызываются / инициализируются в зависимости от этого условия.
Надеюсь, что это помогает кому-то с подобными проблемами!
Мне кажется, что вы должны просто добавить супер вызов в onPause(), который, вероятно, удален в вашем коде. Первая строка трассировки стека: android.util.SuperNotCalledException: Activity {com.example.user.icecres/com.example.user.icecres.AddCourse} не обращалась к super.onPause()
Дайте мне знать, если это помогло.