2016-08-23 3 views
1

Android 개발에 익숙하지 않고 공유 환경 설정 개념을 사용하여 버튼 값을 저장하는 첫 번째 Android 앱을 개발 중입니다.Android에서 Shared Preferecne 로직 관련 문제

내 요구 사항 :

앱을 설치 이후 난생 처음 열

, 버튼을 사용자가 클릭 및 타이머 선택기 대화 상자가 열립니다. 사용자가 원하는 시간을 선택하고 '확인'버튼을 클릭합니다. '확인'버튼을 클릭하면 사용자가 선택한 시간이 버튼 자체의 텍스트로 설정됩니다. 이제 버튼은 사용자가 설정 한 시간을 표시합니다. 사용자가 처음부터 앱을 열 때마다이 값을 사용할 수 있기를 바랍니다.

버튼 값을 저장하기 위해 공유 환경 설정을 사용하고 있습니다. 따라서 사용자가 처음부터 주 활동을 열 때마다 단추는 이전에 사용자가 선택한 시간 값을 표시합니다.

아래 코드에서 필자는 갖고있는 지식과 공유 환경 설정을 구현했으며 앱을 실행 해 보았습니다. 앱을 처음 열면 기본 활동에서 시간 값을 설정하고 해당 시간이 버튼에 올바르게 표시됩니다.

문제에 직면 : 나는 (정지()에서) 뒤로 버튼을 누르거나 최근 애플 리케이션 버튼을 눌렀을 때 메모리에서 응용 프로그램을 제거하면 (에가 파괴()) 다시, 내 응용 프로그램을 열

버튼의 시간 값은 이전에 사용자가 선택한대로 사용할 수 있습니다. 이제 시간을 설정하지 않고 앱을 닫고 앱을 다시 열면 이전에 표시된 값이 기본 텍스트 (예 : '시간 설정')로 바뀝니다. 시간을 설정하지 않고 앱을 닫을 때 문제가 발생합니다. 앱을 다시 열면 버튼의 값이 재설정됩니다.

공유 기본 설정이 두 번째 이후부터 제대로 작동하지 않는 이유를 이해할 수 없습니다.

누군가 아래의 코드를 수정하는 데 도움을주십시오. 미리 감사드립니다 :)

참고 : 클래스 및 레이아웃 xml 파일에 대한 가져 오기는 아래에 포함되어 있지 않습니다.

내 코드 :

public class MainActivity extends Activity implements OnClickListener { 

    SharedPreferences storedata; 

    public static final String filename = "StoredData"; 



    Button ATfrom; 

    int ATfromHour; 
    int ATfromMinute; 

    static long ATfrom_to_millisec; 

    String Active_From_Time; 

    String SP_Active_From_Time = null; 



    @Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 

     super.onDestroy(); 
     storedata = getSharedPreferences(filename, 0); 
     SharedPreferences.Editor editor = storedata.edit(); 
     editor.putString("Active_From_Time", Active_From_Time); 

     editor.commit(); 

    } 

     @Override 
    protected void onStop() { 
     // TODO Auto-generated method stub 
      super.onStop(); 
      storedata = getSharedPreferences(filename, 0); 
      SharedPreferences.Editor editor = storedata.edit(); 
      editor.putString("Active_From_Time", Active_From_Time); 

      editor.commit(); 
    } 

    @Override 
    protected void onRestart() { 
     // TODO Auto-generated method stub 

     super.onRestart(); 
     storedata = getSharedPreferences(filename, 0); 
     SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time"); 

     ATfrom.setText(SP_Active_From_Time); 

    } 
    @Override 
    protected void onResume() { 

     super.onResume(); 
     storedata = getSharedPreferences(filename, 0); 
     SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time"); 


    ATfrom.setText(SP_Active_From_Time); 
    } 



    @Override 
    protected void onStart() { 
     // TODO Auto-generated method stub 
     super.onStart(); 
     storedata = getSharedPreferences(filename, 0); 
     SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time"); 

     ATfrom.setText(SP_Active_From_Time); 

    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 



     ATfrom = (Button) findViewById(R.id.ATfrom); 
     ATfrom.setOnClickListener(this); 



     //calling shared preference to get the value of the button ATfrom 

     storedata = getSharedPreferences(filename, 0); 
     SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time"); 


     ATfrom.setText(SP_Active_From_Time); 

    } 

    @Override 
    protected void onSaveInstanceState(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     String statetosave = ATfrom.getText().toString(); 
     savedInstanceState.putString("saved_state", statetosave); 


     super.onSaveInstanceState(savedInstanceState); 
    } 



    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onRestoreInstanceState(savedInstanceState); 
     String statesaved = savedInstanceState.getString("saved_state"); 
     ATfrom.setText(statesaved); 


    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()) { 


     case R.id.ATfrom: 

      final Calendar ATfromC = Calendar.getInstance(); 
      ATfromHour = ATfromC.get(Calendar.HOUR_OF_DAY); 
      ATfromMinute = ATfromC.get(Calendar.MINUTE); 

      // Launch Time Picker Dialog 
      TimePickerDialog ATfromtpd = new TimePickerDialog(MainActivity.this, 
        new TimePickerDialog.OnTimeSetListener() { 

         @Override 
         public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
          String AM_PM; 
          if (hourOfDay < 12) { 
           AM_PM = "AM"; 
          } else { 
           AM_PM = "PM"; 
           if (hourOfDay > 12) { 
            hourOfDay = hourOfDay - 12; 
           } 
          } 
          if (minute < 10) { 
           ATfrom.setText(hourOfDay + ":0" + minute + " " + AM_PM); 
          } else { 
           ATfrom.setText(hourOfDay + ":" + minute + " " + AM_PM); 
          } 

          //Converting time to string for shared preference 
          Active_From_Time = ATfrom.getText().toString(); 

          ATfrom_to_millisec = (ATfromHour * 60 * 60 * 1000) + (ATfromMinute * 60 * 1000); 


         } 
        }, ATfromHour, ATfromMinute, false); 


      ATfromtpd.show(); 

      break; 
        } 


    } 
} 
+0

논리가 공유 환경 설정을 저장하는 데 사용한 논리가 잘못되었습니다. 활동을 두 번째로 실행하는 동안 (즉, 시간을 설정 한 후 즉각적인 실행) Active_From_Time의 값은 null이며 onDestroy/OnStop 콜백에 저장됩니다. 나는 일단 시간이 onTimeSet() 안에 선택된 공유 환경 설정에 시간 값을 저장하고 u가 한 것처럼 onCreate의 공유 환경 설정에서 값을 가져 오도록 제안합니다. –

+0

'onStop'과'onDestroy'에서 값을 공유 환경 설정에 저장하지 않습니다. 이것들은 –

+0

때문에 무시됩니다.Ramesh와 Vivek를 명확히 해 주셔서 감사합니다 :) –

답변

1

당신의 이동 중지 및들의 OnDestroy 방법이 필요하지 않습니다. 이처럼 클릭 리스너를 중지시 및들의 OnDestroy를 제거하고 업데이트 : 앱 종료 Active_From_Time 값 얻을 오버라이드를 실행하고 공유 환경 설정에서 업데이트

@Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()) { 


     case R.id.ATfrom: 

      final Calendar ATfromC = Calendar.getInstance(); 
      ATfromHour = ATfromC.get(Calendar.HOUR_OF_DAY); 
      ATfromMinute = ATfromC.get(Calendar.MINUTE); 

      // Launch Time Picker Dialog 
      TimePickerDialog ATfromtpd = new TimePickerDialog(MainActivity.this, 
        new TimePickerDialog.OnTimeSetListener() { 

         @Override 
         public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
          String AM_PM; 
          if (hourOfDay < 12) { 
           AM_PM = "AM"; 
          } else { 
           AM_PM = "PM"; 
           if (hourOfDay > 12) { 
            hourOfDay = hourOfDay - 12; 
           } 
          } 
          if (minute < 10) { 
           ATfrom.setText(hourOfDay + ":0" + minute + " " + AM_PM); 
          } else { 
           ATfrom.setText(hourOfDay + ":" + minute + " " + AM_PM); 
          } 

          //Converting time to string for shared preference 
          Active_From_Time = ATfrom.getText().toString(); 

          ATfrom_to_millisec = (ATfromHour * 60 * 60 * 1000) + (ATfromMinute * 60 * 1000); 
    storedata = getSharedPreferences(filename, 0); 
       SharedPreferences.Editor editor = storedata.edit(); 
       editor.putString("Active_From_Time", Active_From_Time); 

       editor.commit(); 

         } 
        }, ATfromHour, ATfromMinute, false); 


      ATfromtpd.show(); 

      break; 
        } 


    } 

매번으로.

해피 코딩 !!!

+0

코드와 함께 정교한 대답을하면 이해하는데 도움이됩니다. 귀하의 답변과 시간 Anjali 주셔서 감사합니다 :) –