布尔' isChecked'来自内部类(Android)

时间:2014-11-01 12:58:42

标签: android

我创建了一个开关来打开/关闭闹钟。但是当我想在关闭时保存开关的值时,我得到一个错误:“从内部类中访问变量'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的代码中。

怎么办?

1 个答案:

答案 0 :(得分:0)

在这里把决赛放在最后面......

public void onCheckedChanged(CompoundButton buttonView,
                                     final boolean isChecked)

您的DialogInterface.OnClickListener是一个匿名类。声明它的函数中的所有“final”变量都被复制为匿名类的字段。 final关键字使值保持不变。需要恒定值以避免歧义。否则,如果复制字段的值可能会发生变化,那么不完全清楚不确定类会保持什么值 - 它是否取决于函数声明类的位置,或者执行它的时间,还是某些其他因素?它必须是恒定的,所以它无关紧要......