我想创建一个EditText视图数组,然后为该数组内仅“与日期相关”的EditText视图分配OnClickListener。侦听器将弹出一个DatePickerDialog供用户输入。代码如下:
oEditText = new EditText[oFieldNames.length]; // oFieldNames contains field names like e.g. "Student ID", "Student Name", "Birth Date", "Start Date", "Gender", etc.
for (int i = 0; i < oFieldNames.length; i++) {
oEditText[i] = new EditText(oContext);
...
// code for "Date-related" EditText view:
if (oFieldNames[i].toLowerCase().contains("date") == true) {
oEditText[i].setFocusable(false);
oEditText[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int day = oCalendar.get(Calendar.DAY_OF_MONTH);
int month = oCalendar.get(Calendar.MONTH);
int year = oCalendar.get(Calendar.YEAR);
datePickerDialog = new DatePickerDialog(oContext, new DatePickerDialog.OnDateSetListener(){
@Override
public void onDateSet(DatePicker datePicker, int iYear, int iMonth, int iDay) {
oEditText[i] = (iYear + "/" + (iMonth+1) + "/" + iDay);
}
}, year, month, day); // ERROR here!!!
datePickerDialog.show();
}
});
}
}
如预期的那样,错误消息出现,提示在内部类中访问了变量'i',并且必须将其声明为“最终” 。好吧,因为我正在使用“ i”进行for循环,所以coz的变量“ i”不应为“ final”。看起来我需要通过创建一个新的自定义EditText类来重组代码,但这很麻烦。关于如何进行小的更改以使其成功运行的任何想法?
谢谢!
答案 0 :(得分:0)
在这里,我进行了一些更改,以将变量i更改为final。试试
for (int i = 0; i < oFieldNames.length; i++) {
oEditText[i] = new EditText(oContext);
...
// code for "Date-related" EditText view:
if (oFieldNames[i].toLowerCase().contains("date") == true) {
oEditText[i].setFocusable(false);
final int tempI=i;
oEditText[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int day = oCalendar.get(Calendar.DAY_OF_MONTH);
int month = oCalendar.get(Calendar.MONTH);
int year = oCalendar.get(Calendar.YEAR);
datePickerDialog = new DatePickerDialog(oContext, new DatePickerDialog.OnDateSetListener(){
@Override
public void onDateSet(DatePicker datePicker, int iYear, int iMonth, int iDay) {
oEditText[tempI] = (iYear + "/" + (iMonth+1) + "/" + iDay);
}
}, year, month, day); // ERROR here!!!
datePickerDialog.show();
}
});
}
}
答案 1 :(得分:0)
在for循环内部将我的值分配给最终变量,然后像这样使用它
for (int i = 0; i < oFieldNames.length; i++) {
final int index = i;
oEditText[index].setOnClickListener(new OnClickListener() {
void onClick(View v) {
Log.i("TAG", "The index is" + index);
}
});
}
答案 2 :(得分:0)
您可以为每个引用数组中EditText的循环设置最终的EditText。
同样在Basic base64("token:")
内,使用onDateSet()
设置EditText的文本。
将您的代码更改为此:
setText()
答案 3 :(得分:0)
您应该在调用setOnClickListener和创建内部类之前创建最终变量。
final int j = i;
然后使用j代替i