Динамически создавать OnClickListener в массиве представлений EditText - PullRequest
0 голосов
/ 25 октября 2018

Я хотел бы создать массив представлений EditText, а затем назначить OnClickListener только для представлений EditText, относящихся к дате, внутри массива.Слушатель выскакивает 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' из coz не должна быть 'final', так как я делаю цикл for с 'i'.Похоже, мне нужно реструктурировать код, создав новый пользовательский класс EditText, но это хлопотно.Любая идея о том, как сделать небольшие изменения, чтобы он мог успешно работать?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 25 октября 2018

Вы должны создать окончательную переменную перед вызовом setOnClickListener и созданием внутреннего класса.

final int j = i;

, затем используйте j вместо i

0 голосов
/ 25 октября 2018

Внутри цикла. Назначьте значение i в конечную переменную, затем используйте его следующим образом:

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);
    }
});
}
0 голосов
/ 25 октября 2018

Вы можете установить окончательный EditText для каждого цикла, который ссылается на EditText в массиве.Также внутри onDateSet() используйте setText() для установки текста EditText.Измените свой код на это:

    for (int i = 0; i < oFieldNames.length; i++) {
        oEditText[i] = new EditText(oContext);
        final EditText et = oEditText[i];

        // code for "Date-related" EditText view:
        if (oFieldNames[i].toLowerCase().contains("date") == true) {
            et.setFocusable(false);
            et.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) {
                            et.setText(iYear + "/" + (iMonth+1) + "/" + iDay);
                        }
                    }, year, month, day);    // ERROR here!!!
                    datePickerDialog.show();
                }
            });
        }
    }
0 голосов
/ 25 октября 2018

здесь я внес некоторые изменения, чтобы сделать переменную i финальной.попробуйте

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();    
            }
        });
    }
}
...