Позвольте мне начать с признания того, что я исхожу из фона Erlang и новичок в программировании на Android и Java ... честно говоря, объектная ориентация дает мне Головная боль. :)Android: статический справочный/нестатический метод при использовании findViewById (ID)
У меня возникли проблемы с липким старым каштаном: «Невозможно сделать статическую ссылку на нестатический метод». В основном я пишу приложение, которое получает XML с нашего сервера и использует его для создания формы для заполнения пользователем. Мне удалось успешно разобрать XML и создать (и отобразить) форму. Я назначаю каждое поле EditText своим собственным идентификатором, используя (очень) простой алгоритм, который я могу воссоздать позже.
Я занят отправкой кнопки, которая возвращает сообщение HTTP на наш сервер с введенными пользователем данными. Моя проблема возникает, когда я пытаюсь получить значения, введенные пользователем в форму. То, что я пытаюсь сделать, - это пропустить мои идентификаторы, открыть каждый экземпляр EditText, используя EditText.findViewById (ID), и получить его текст, используя getText(). Когда я это делаю, я получаю сообщение об ошибке «Невозможно сделать статическую ссылку на нестатический метод».
Теперь я прочитал и понял, что это потому, что я пытаюсь получить нестатический метод статическим способом и для того, чтобы сделать его статическим, мне нужно вызвать метод экземпляр, а не класс в целом ... проблема в том, что я нахожу его в порядке, чтобы получить этот конкретный экземпляр, и я не могу понять, что я должен делать по-другому.
Я бы очень признателен за любую помощь, совет или дальнейшее чтение, которое у меня есть для меня.
Приветствия, Беван
P.S. Вот соответствующие разделы моего кода
private static LinearLayout renderForm(...)
{
//Build Fields
...
//Build Buttons
...
Button BT = new Button(App);
BT.setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
...
for(int j = 0; j < FFListLength; j++)
{
EditText BinField = (EditText) EditText.findViewById(20000+j);
...
}
...
}
}
}
Update: После прочтения ответа JB Nizet, я понял, что я делаю неправильно. Я изменил строку: EditText BinField = (EditText) EditText.findViewById (20000 + j); : EditText binField = (EditText) lContent.findViewById (20000 + j);
где lContent - это контент моего представления.
Спасибо за помощь. Bevan
Пожалуйста, соблюдайте соглашения об именах Java: переменные начинаются с строчной буквы. Если вы соблюдаете эти соглашения, вы сможете легче отличить вызовы от статических методов от вызовов к методам экземпляра. –
Спасибо за совет JB Nizet, я постараюсь придерживаться этого. В Erlang это как раз наоборот, переменные начинаются с капиталов, а функции начинаются с строчных букв ... еще одно изменение для меня, чтобы привыкнуть. –
переменная и функции начинаются с строчной буквы в java. классы и перечисления начинаются с верхнего регистра. также обратите внимание, что ваш вызов «findViewById» не рекомендуется из-за его большого цикла. подумайте о сохранении массива/списка элементов, о которых вы знаете, о представлениях, которые вы хотите обработать. если вы хотите, вы можете иметь идентификаторы с именем «edittext1», «edittext2», ... и использовать getidentifier для получения своего идентификатора, а затем переходить через них в цикле и останавливаться, когда вы не получаете их Я бы . –