2017-03-03 9 views
0

私はを開き、時間を選択することができるTextViewを作成し、TextViewを選択した時間で正しく更新します。しかし、Activityを離れるたびにTextViewの現在時刻に更新しますが、選択した時刻をSharedPreferencesに保存して、変更する場合にのみ変更します。私はこれで2日間過ごしましたが、時間を節約できませんでした。助けてください、以下は私のコードです。私が欲しいものタイムピッカーダイアログと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

保存して空白の値を取得するのはそれですか? – Remario

答えて

0

コードでは2つのことを行う必要があります。

最初に、ユーザ設定時刻にデータを保存してから、Activityを作成するとSharedPreferencesのデータをロードする必要があります。

最初に行うには、時間文字列を取得し、SharedPreferencesに保存します。私は明確にする(テストしていない)あなたのコードを変更しました:

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(); 
} 

今、あなたはTimePickerDialogの時間毎回ユーザーの変更を保存しています。

さて、onCreate()に、あなたはTextViewにロードします:

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)); 

だから、毎回あなたのActivityが作成され、それがsharedPreferencesからデータを取得し、変更されたとき、あまりにもそこに変更されます。

希望すると助かります

+1

後者のコードブロックでsharedPrefに割り当てるものを見逃してしまったので、テストしたコードを入れてください。 –

+0

ありがとうございます。問題はIdentationにありました。 = D –

+1

心配なし:) btwインデント* –

0

SharedPreferences

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

あなたはSharedPreferencesにあなたの時間を保存していないに選択した時間を節約することです。 CheckBoxがチェックされているかどうかだけを保存しました。

pHourpMinuteを更新すると、アプリケーションを閉じるまで値が保存されます。それ以降に保存したい場合は、上記のbooleanのようにSharedPreferencesに入れてください。そして、ここに値を設定します

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 


} 

SharedPreferencesからだけではなく、クラス変数を使用して値を取得します。あなたがそうするなら、それは機能するのですか?