2017-03-03 2 views
0

Ich habe eine TextView erstellt, die eine TimePickerDialog öffnet und ich bin in der Lage, Zeit zu wählen, aktualisiert es die TextView korrekt mit der gewählten Zeit. Aber wann immer ich die Activity verlasse und zurückkomme, aktualisiert die TextView die aktuelle Zeit, aber was ich will ist, die gewählte Zeit auf SharedPreferences zu speichern und sie nur zu ändern, wenn ich mich entscheide, mich zu ändern. Ich habe 2 Tage damit verbracht, aber ich konnte die Zeit nicht sparen. Bitte helfe, das ist mein Code.Timepicker Dialog und SharedPreferences

package com.example.dexter.ddiary; 

import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.Dialog; 
import android.app.PendingIntent; 
import android.app.TimePickerDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.CheckBox; 
import android.widget.TextView; 
import android.widget.TimePicker; 

import java.util.Calendar; 
import java.util.Date; 

public class RemindersActivity extends AppCompatActivity { 


    Calendar calender = Calendar.getInstance(); 


    TextView mTimeView; 


    private int pHour; 
    private int pMinute; 

    static final int TIME_DIALOG_ID = 0; 


    private void updateDisplay() { 
     mTimeView.setText(new StringBuilder() 
       .append(pad(pHour)).append(":") 
       .append(pad(pMinute))); 


    } 


    private static String pad(int c) { 
     if (c >= 10) 
      return String.valueOf(c); 
     else 
      return "0" + String.valueOf(c); 
    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_reminders); 


     final SharedPreferences sharedPref = RemindersActivity.this.getPreferences(Context.MODE_PRIVATE); 
     boolean isMyValueChecked = sharedPref.getBoolean("checkbox", false); 
     CheckBox checkbox = (CheckBox) findViewById(R.id.checkbox_alert); 
     checkbox.setChecked(isMyValueChecked); 


     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 


     findViewById(R.id.checkbox_alert).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       SharedPreferences.Editor editor = sharedPref.edit(); 
       editor.putBoolean("checkbox", ((CheckBox) view).isChecked()); 
       editor.commit(); 


       calender.set(Calendar.HOUR_OF_DAY, pHour); 
       calender.set(Calendar.MINUTE, pMinute); 

       Intent intent = new Intent(getApplicationContext(), NotificationReciever.class); 

       PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 100, 
         intent, PendingIntent.FLAG_UPDATE_CURRENT); 

       AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
       alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calender.getTimeInMillis(), 
         alarmManager.INTERVAL_DAY, pendingIntent); 


      } 
     }); 

     mTimeView = (TextView) findViewById(R.id.time_set); 
     mTimeView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 


       showDialog(TIME_DIALOG_ID); 

      } 
     }); 

     final Calendar calendar = Calendar.getInstance(); 
     pHour = calendar.get(Calendar.HOUR_OF_DAY); 
     pMinute = calendar.get(Calendar.MINUTE); 


    } 


    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
      case TIME_DIALOG_ID: 
       return new TimePickerDialog(RemindersActivity.this, mTimeSetListener, pHour, pMinute, false); 

     } 

     return null; 
    } 

    private TimePickerDialog.OnTimeSetListener mTimeSetListener = 
      new TimePickerDialog.OnTimeSetListener() { 
       @Override 
       public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 

        pHour = hourOfDay; 
        pMinute = minute; 

        updateDisplay();  
       } 
      };  
} 
+0

ist es, dass es nicht speichert, und Sie einen leeren Wert bekommen; – Remario

Antwort

0

Nun, Sie müssen 2 Dinge in Ihrem Code tun.

Zuerst müssen Sie die Daten speichern, wenn Benutzer Zeit einstellen, dann müssen Sie die Daten von SharedPreferences laden, wenn Activity erstellt wird.

Um die erste zu tun, erhalten Sie Ihre Zeit Zeichenfolge und speichern sie auf SharedPreferences. Ich habe Ihren Code geändert (nicht getestet) zu klären:

private void updateDisplay() { 
    String timeSet = new StringBuilder() 
      .append(pad(pHour)).append(":") 
      .append(pad(pMinute)).toString(); 

    mTimeView.setText(timeSet); 

    SharedPreferences sharedPref = RemindersActivity.this.getPreferences(Context.MODE_PRIVATE); 
    SharedPreferences.Editor prefEditor = sharedPref.edit(); 
    sharedPref.putString("timeSet", timeSet); 
    sharedPref.commit(); 
} 

Jetzt bist du Zeit jedes Mal Benutzer Änderung der TimePickerDialog speichern.

, jetzt in onCreate(), Sie werden auf die TextView laden:

final SharedPreferences sharedPref = RemindersActivity.this.getPreferences(Context.MODE_PRIVATE); 
boolean isMyValueChecked = sharedPref.getBoolean("checkbox", false); 
CheckBox checkbox = (CheckBox) findViewById(R.id.checkbox_alert); 
checkbox.setChecked(isMyValueChecked); 
mTimeView.setText(sharedPref.getString("timeSet", null)); 

Also, jedes Mal wenn Ihr Activity erstellt wird, wird es die Daten von sharedPreferences erhalten, und wenn geändert wird, wird es ändern.

Hoffe es hilft

+1

Sie haben verpasst, was Sie sharedPref im letzten Codeblock zuweisen sollten. Bitte geben Sie auch den Code an, den Sie getestet haben, und sicher! –

+0

Danke. Das Problem war mit der Identität. = D –

+1

keine Sorgen :) btw es ist Einrückung * –

0

, was ich will, ist die gewählte Zeit SharedPreferences

SharedPreferences.Editor editor = sharedPref.edit(); 
      editor.putBoolean("checkbox", ((CheckBox) view).isChecked()); 
      editor.commit(); 

Sie haben speichern nicht Ihre Zeit in Anspruch SharedPreferences gespeichert. Sie haben nur gespeichert, ob CheckBox überprüft wird oder nicht.

Wenn Sie pHour und pMinute aktualisieren, werden Ihre Werte gespeichert, bis Sie die App schließen. Wenn Sie möchten, dass sie danach gespeichert werden, legen Sie sie in SharedPreferences, wie Sie mit dem boolean oben getan haben. Dann ist hier die Werte zu setzen:

private void updateDisplay() { 
    mTimeView.setText(new StringBuilder() 
      .append(pad(pHour)).append(":") //use values from SharedPreferences here instead of pHour 
      .append(pad(pMinute))); //and here instead of pMinute 


} 

die Werte von SharedPreferences erhalten, anstatt nur die Klassenvariablen. Wenn Sie das tun, funktioniert es?