2

편집 : onPause()onResume()을 추가 한 후 앱이 더 이상 충돌하지 않습니다. 그러나 인스턴스는 여전히 저장되지 않으며 나는 EditText 안에 넣은 텍스트를 잃어 버립니다. 나는 onPause(), onStop()을 사용하여 인스턴스를 저장해야한다고 추측하고 onResume() (또는 어쩌면이 onSaveInstanceState(), onRestoreInstanceState()을 함께 사용)을 호출합니다. 지금이 세 가지 방법을 사용하는 방법에 대해 읽고 있습니다. 어떤 조언을 부탁드립니다.savedInstanceState가 구현 된 후 Android 앱이 중지됩니다.

저는 현재 4 가지 (아마도 5 가지)의 활동으로 간단한 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()edCourse1.getText()+""에서 텍스트로 edC1 저장됩니다 등등, 다음 onRestoreInstanceState()StringedCourse1-edC1 내부 등을 복원합니다.

문제가 생겨서 다음 호를 어떻게 해결할 수 있을지 모르겠으니 페이지의 버튼 상태를 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

나는이 추가 "@Override protected void onPause() { super.onPause(); }" – Win

+0

@Win onPause "FragmentActivity에서 onPause() (android.os.Bundle)에 적용 할 수 없습니다"; '공공 무효 onPause (번들 savedInstanceState) { super.onPause (savedInstanceState) : – 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()은 충돌시 상태를 복원하는 데 사용됩니다. onCreate()에있는 ifelse은 복원 할 이전 상태가 있었는지 여부 (onStop)가 있는지 확인하는 데 사용되며 값은이 조건에 따라 호출/초기화됩니다.

호프는 이와 유사한 문제를 가진 사람을 돕습니다.