2016-08-23 3 views
1

Я новичок в разработке Android, и я разрабатываю свое первое приложение для Android, в котором я использую концепцию общих настроек для сохранения значения кнопки.Проблема с логикой Shared Preferecne в Android

Мое требование:

Когда приложение открыто в первый раз после установки, открывается пользователь нажимает на кнопку и диалоговое окно выбора таймера. Пользователь выбирает предпочтительное время и нажимает кнопку «ОК». После нажатия кнопки «ОК» время, выбранное пользователем, устанавливается как текст на самой кнопке. Таким образом, теперь кнопка отображает время, заданное пользователем. Я хочу, чтобы это значение было доступно, когда пользователь открывает приложение отдельно от первого раза.

Чтобы сохранить эту кнопку, я использую общие предпочтения. Следовательно, всякий раз, когда пользователь открывает основное действие, кроме первого раза, кнопка отображает значение времени, выбранного ранее пользователем.

В приведенном ниже коде я использовал общие предпочтения со знанием, которое у меня есть, и я попытался запустить свое приложение. Когда приложение открывается в первый раз, в основном действии я устанавливаю значение времени и это время отображается правильно на кнопке.

Проблема Столкнувшись:

Когда я нажимаю кнопку назад (On Stop()) или удалить приложение из памяти, нажав на кнопку Недавние приложения (On Destroy()) и откройте мое приложение снова, значение времени на кнопке доступно, как было выбрано пользователем ранее. Теперь, когда я закрываю приложение без установки времени и снова открываю приложение, кнопка, отображаемая ранее, заменяется текстом по умолчанию (т. Е. «Установить время»). Проблема в том, что я не устанавливаю время и закрываю приложение, значение в кнопке сбрасывается, когда приложение открывается снова.

Я не могу понять, почему общие предпочтения не работают должным образом со второго раза.

Кто-то, пожалуйста, помогите мне в исправлении приведенного ниже кода. Заранее спасибо :)

Примечание: Импорт для 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. я хотел бы предложить u, чтобы сохранить значение времени для общих предпочтений, как только время выбрано внутри onTimeSet(), и получить значение из общих настроек в onCreate, как вы это сделали. –

+0

не сохраняют значения для общих настроек в 'onStop' и' onDestroy', они получают переопределение из-за этого –

+0

Понятно.Спасибо за разъяснение Ramesh и Vivek :) –

ответ

1

ваш OnStop и метод OnDestroy не требуется. Удалить OnStop и OnDestroy и обновить клик слушателя, как это:

@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; 
        } 


    } 

Как каждый раз, когда вы запустите приложение и значение Active_From_Time выход получить переопределение и обновляются в общей предпочтительности.

Счастливое кодирование !!!

+0

Ваш сложный ответ вместе с кодом был действительно полезен в понимании. Спасибо за ваш ответ и время Анджали :) –

Смежные вопросы