从内部类访问变量而不是最终的

我怎么能让这个工作:

public void onStart() { super.onStart(); int dayN = 0; int i = 0; String day = null; String addFach; String mo1 = null; String mo2 = null; String mo3 = null; String mo4 = null; String mo5 = null; String mo6 = null; String mo7 = null; String mo8 = null; String mo9 = null; String mo10 = null; String mo11 = null; String di1 = null; String di2 = null; String di3 = null; String di4 = null; String di5 = null; String di6 = null; String di7 = null; String di8 = null; String di9 = null; String di10 = null; String di11 = null; String mi1 = null; String mi2 = null; String mi3 = null; String mi4 = null; String mi5 = null; String mi6 = null; String mi7 = null; String mi8 = null; String mi9 = null; String mi10 = null; String mi11 = null; String do1 = null; String do2 = null; String do3 = null; String do4 = null; String do5 = null; String do6 = null; String do7 = null; String do8 = null; String do9 = null; String do10 = null; String do11 = null; String fr1 = null; String fr2 = null; String fr3 = null; String fr4 = null; String fr5 = null; String fr6 = null; String fr7 = null; String fr8 = null; String fr9 = null; String fr10 = null; String fr11 = null; while (dayN <= 4) { if (dayN == 0) { day = "Montag"; } else if (dayN == 1) { day = "Dienstag"; } else if (dayN == 2) { day = "Mittwoch"; } else if (dayN == 3) { day = "Donnerstag"; } else if (dayN == 4) { day = "Freitag"; } while (i <= 10) { BufferedReader buf; try { buf = new BufferedReader(new FileReader("/sdcard/" + i + day + "fach.txt")); addFach = buf.readLine(); if (day == "Montag") { if (i == 0) mo1 = addFach; else if (i == 1) mo2 = addFach; else if (i == 2) mo3 = addFach; else if (i == 3) mo4 = addFach; else if (i == 4) mo5 = addFach; else if (i == 5) mo6 = addFach; else if (i == 6) mo7 = addFach; else if (i == 7) mo8 = addFach; else if (i == 8) mo9 = addFach; else if (i == 9) mo10 = addFach; else if (i == 10) mo11 = addFach; } else if (day == "Dienstag") { if (i == 0) di1 = addFach; else if (i == 1) di2 = addFach; else if (i == 2) di3 = addFach; else if (i == 3) di4 = addFach; else if (i == 4) di5 = addFach; else if (i == 5) di6 = addFach; else if (i == 6) di7 = addFach; else if (i == 7) di8 = addFach; else if (i == 8) di9 = addFach; else if (i == 9) di10 = addFach; else if (i == 10) di11 = addFach; } else if (day == "Mittwoch") { if (i == 0) mi1 = addFach; else if (i == 1) mi2 = addFach; else if (i == 2) mi3 = addFach; else if (i == 3) mi4 = addFach; else if (i == 4) mi5 = addFach; else if (i == 5) mi6 = addFach; else if (i == 6) mi7 = addFach; else if (i == 7) mi8 = addFach; else if (i == 8) mi9 = addFach; else if (i == 9) mi10 = addFach; else if (i == 10) mi11 = addFach; } else if (day == "Donnerstag") { if (i == 0) do1 = addFach; else if (i == 1) do2 = addFach; else if (i == 2) do3 = addFach; else if (i == 3) do4 = addFach; else if (i == 4) do5 = addFach; else if (i == 5) do6 = addFach; else if (i == 6) do7 = addFach; else if (i == 7) do8 = addFach; else if (i == 8) do9 = addFach; else if (i == 9) do10 = addFach; else if (i == 10) do11 = addFach; } else if (day == "Freitag") { if (i == 0) fr1 = addFach; else if (i == 1) fr2 = addFach; else if (i == 2) fr3 = addFach; else if (i == 3) fr4 = addFach; else if (i == 4) fr5 = addFach; else if (i == 5) fr6 = addFach; else if (i == 6) fr7 = addFach; else if (i == 7) fr8 = addFach; else if (i == 8) fr9 = addFach; else if (i == 9) fr10 = addFach; else if (i == 10) fr11 = addFach; } } catch (Exception e) { } i++; } i = 0; dayN++; } RadioButton rB1 = (RadioButton) getView().findViewById(R.id.stunde1); RadioButton rB2 = (RadioButton) getView().findViewById(R.id.stunde2); RadioButton rB3 = (RadioButton) getView().findViewById(R.id.stunde3); RadioButton rB4 = (RadioButton) getView().findViewById(R.id.stunde4); RadioButton rB5 = (RadioButton) getView().findViewById(R.id.stunde5); RadioButton rB6 = (RadioButton) getView().findViewById(R.id.stunde6); RadioButton rB7 = (RadioButton) getView().findViewById(R.id.stunde7); RadioButton rB8 = (RadioButton) getView().findViewById(R.id.stunde8); RadioButton rB9 = (RadioButton) getView().findViewById(R.id.stunde9); RadioButton rB10 = (RadioButton) getView().findViewById(R.id.stunde10); RadioButton rB11 = (RadioButton) getView().findViewById(R.id.stunde11); DatePicker dP = (DatePicker) getView().findViewById(R.id.datePicker); dP.init(dP.getYear(), dP.getMonth(), dP.getDayOfMonth(), new DatePicker.OnDateChangedListener() { public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Calendar cal = Calendar.getInstance(); cal.set(year, monthOfYear, dayOfMonth); int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); switch(dayOfWeek) { case Calendar.MONDAY: rB1.setText(mo1); break; } } }); } 

它应该根据所选日期的工作日和datepicker设置一些radiobuttons的文本。 我不能将字符串设置为final,因为它们被赋值为2次。

如果将它们声明为成员变量(在方法之外,最好在onCreate()之前将其声明为可读性),它们将在整个Activity可访问,甚至可以访问Activity内部类。

不,不可能。

JLS#第8章

使用但未在内部类中声明的任何局部变量,forms参数或exception参数必须声明为final。

必须在内部类的主体之前明确赋值(§16)使用但未在内部类中声明的任何局部变量。

作为旁注:使用Collections而不是声明许多字段。

以下是如何从docs访问它们的示例:

 class WithDeepNesting { boolean toBe; WithDeepNesting(boolean b) { toBe = b; } class Nested { boolean theQuestion; class DeeplyNested { DeeplyNested(){ theQuestion = toBe || !toBe; // here you are able to access now. } } } } 

通常的方法是将它们转换为成员变量。 但是,在您的情况下,您需要重新考虑您的设计。

你有太多的代码重复。 您应该重构它以使用集合,此时内部类问题会自行解决。