2

EDIT: после добавления onPause() и onResume() приложение перестает работать; однако экземпляр все еще не сохраняется, и я теряю текст, который я помещаю внутри EditText. Я предполагаю, что я должен сохранить экземпляр, используя onPause(), onStop() и вспомнить его, используя onResume() (или, может быть, используя это иonSaveInstanceState(), onRestoreInstanceState()) - Я читаю о том, как использовать эти три метода сейчас, и я бы оцените любые указатели.Приложение Android останавливается после сохраненияInstanceState реализовано

В настоящее время я пишу простое приложение для 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 добавит имя к кнопке и сделает ее видимой. Я предполагаю, что проблема, с которой я столкнулся, заключается в следующем: все кнопки станут невидимыми при перезапуске приложения.

+0

Вы можете опубликовать трассировку стека от сбоя. –

ответ

1

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

Пусть я знаю, помогло ли это.

+0

Я добавил это: 'общественная пустота OnPause (Bundle savedInstanceState) { super.onPause (savedInstanceState);' И это ошибки "OnPause() в FragmentActivity не может быть применен к (android.os.Bundle)" – Win

+0

@Win OnPause должен выглядеть следующим образом: "@Override protected void onPause() { super.onPause(); }" – peresisUser

+0

@win возможно опубликовать весь код операции? может быть что-то еще .. – peresisUser

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

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