我创建了一个开关来打开/关闭闹钟。但是当我想在关闭时保存开关的值时,我得到一个错误:“从内部类中访问变量'isChecked',需要声明为最终”
这是我的代码:
final Switch mySwitch = (Switch) findViewById(R.id.theswitch);
//attach a listener to check for changes in state
mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
final SharedPreferences myPrefs = getSharedPreferences("myPrefs",0);
final SharedPreferences.Editor editor = myPrefs.edit();
editor.putBoolean("switch", isChecked);
editor.commit();
if(isChecked){
//switch has been switched ON
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+1:00"));
Date currentLocalTime = cal.getTime();
DateFormat date = new SimpleDateFormat("HH:mm");
// you can get seconds by adding "...:ss" to it
date.setTimeZone(TimeZone.getTimeZone("GMT+1:00"));
String localTime = date.format(currentLocalTime);
Log.w(localTime, "1");
if (localTime.equals("08:50") || localTime.equals("08:51") || localTime.equals("08:52")|| localTime.equals("08:53")|| localTime.equals("08:54") || localTime.equals("08:55") || localTime.equals("08:56")
|| localTime.equals("08:57")|| localTime.equals("08:58")|| localTime.equals("08:59")|| localTime.equals("09:00")|| localTime.equals("09:01")|| localTime.equals("09:02")|| localTime.equals("09:03")
|| localTime.equals("09:04")|| localTime.equals("09:05")|| localTime.equals("09:06")|| localTime.equals("09:07")|| localTime.equals("09:08")|| localTime.equals("09:09")|| localTime.equals("09:10")
|| localTime.equals("09:11")|| localTime.equals("09:12")|| localTime.equals("09:13")|| localTime.equals("09:14")|| localTime.equals("09:15")|| localTime.equals("09:16")|| localTime.equals("09:17")
|| localTime.equals("09:18")|| localTime.equals("09:19")|| localTime.equals("09:20")|| localTime.equals("09:21")|| localTime.equals("09:22")|| localTime.equals("09:23")|| localTime.equals("09:24")
|| localTime.equals("09:25")|| localTime.equals("09:26")|| localTime.equals("09:27")|| localTime.equals("09:28")|| localTime.equals("09:29")|| localTime.equals("09:30")|| localTime.equals("09:31")
|| localTime.equals("09:32")|| localTime.equals("09:33")|| localTime.equals("09:34")|| localTime.equals("09:35")|| localTime.equals("09:36")|| localTime.equals("09:37")|| localTime.equals("09:38")
|| localTime.equals("09:39")|| localTime.equals("09:40")|| localTime.equals("09:41")|| localTime.equals("09:42")|| localTime.equals("09:43")|| localTime.equals("09:44")|| localTime.equals("09:45")
|| localTime.equals("09:46")|| localTime.equals("09:47")|| localTime.equals("09:48")|| localTime.equals("09:49")|| localTime.equals("09:50")|| localTime.equals("09:51")|| localTime.equals("09:52")
|| localTime.equals("09:53")|| localTime.equals("09:54")|| localTime.equals("09:55")|| localTime.equals("09:56")|| localTime.equals("09:57")|| localTime.equals("09:58")|| localTime.equals("09:59")
|| localTime.equals("10:00")|| localTime.equals("10:01")|| localTime.equals("10:02")|| localTime.equals("10:03")|| localTime.equals("10:04")|| localTime.equals("10:05")|| localTime.equals("10:06")
|| localTime.equals("10:07")|| localTime.equals("10:08")|| localTime.equals("10:09")|| localTime.equals("10:10")|| localTime.equals("12:35")|| localTime.equals("12:57")|| localTime.equals("09:00")){
Log.w("It is between", "those times");
boolean beenfired2 = myPrefs.getBoolean("beenfired", false);
if (beenfired2 != true){
firenotifications();
beenfired = true;
editor.putBoolean("beenfired", beenfired);
editor.commit();
}
else {
Log.w("else", "else");
}
}
else {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(Inlopen.this);
// set title
alertDialogBuilder.setTitle("Alarm kan niet worden ingeschakeld");
// set dialog message
alertDialogBuilder
.setMessage("U kunt het alarm alleen inschakelen tussen 9:00 en 10:00 's ochtends.")
.setCancelable(false)
.setNegativeButton("Oke", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// if this button is clicked, just close
// the dialog box and do nothing
mySwitch.setChecked(false);
editor.putBoolean("switch", isChecked);
editor.commit();
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}
}
else{
//switch has been switched OFF
}
}
});
}
问题出在AlertDialog的代码中。
怎么办?
答案 0 :(得分:0)
在这里把决赛放在最后面......
public void onCheckedChanged(CompoundButton buttonView,
final boolean isChecked)
您的DialogInterface.OnClickListener是一个匿名类。声明它的函数中的所有“final”变量都被复制为匿名类的字段。 final关键字使值保持不变。需要恒定值以避免歧义。否则,如果复制字段的值可能会发生变化,那么不完全清楚不确定类会保持什么值 - 它是否取决于函数声明类的位置,或者执行它的时间,还是某些其他因素?它必须是恒定的,所以它无关紧要......