在EditText视图数组中动态创建OnClickListener

时间:2018-10-25 10:40:41

标签: java android android-edittext onclicklistener

我想创建一个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类来重组代码,但这很麻烦。关于如何进行小的更改以使其成功运行的任何想法?

谢谢!

4 个答案:

答案 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