2017-03-03 36 views
0

我创建了一个TextView,它打开了一个TimePickerDialog,我可以选择时间,它会根据所选时间正确更新TextView。但每当我离开Activity并回来,TextView更新到当前时间,但我想要的是将选定的时间保存到SharedPreferences并只在我决定更改时更改它。我已经花了2天时间,但我无法节省时间。请帮忙,以下是我的代码。Timepicker对话框和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。我已经改变了你的代码(没有测试)澄清:在TimePickerDialog

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

现在你节省时间,每次用户改变。

现在,在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

不用担心:)顺便说一句,这是缩进* –

0

我要的是所选时间保存到SharedPreferences

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

您没有保存你的时间SharedPreferences。您只保存了CheckBox是否被选中。

当您更新pHourpMinute时,将保存您的值直到关闭该应用程序。如果您希望在此之后保存它们,请将它们放入SharedPreferences,就像您上面的boolean一样。然后在这里设置的值:

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得到的值,而不是仅仅使用类变量。如果你这样做,它的工作?

相关问题