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() используется для восстановления состояния при сбое. ifelse в onCreate(), используется, чтобы определить, было ли предыдущее состояние, которое будет восстановлено или нет onStop), и значения вызываются / инициализируются в зависимости от этого условия.

Надеюсь, что это помогает кому-то с подобными проблемами!

Мне кажется, что вы должны просто добавить супер вызов в onPause(), который, вероятно, удален в вашем коде. Первая строка трассировки стека: android.util.SuperNotCalledException: Activity {com.example.user.icecres/com.example.user.icecres.AddCourse} не обращалась к super.onPause()

Дайте мне знать, если это помогло.

Другие вопросы по тегам