2012-05-26 3 views
1

Позвольте мне начать с признания того, что я исхожу из фона 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

+0

Пожалуйста, соблюдайте соглашения об именах Java: переменные начинаются с строчной буквы. Если вы соблюдаете эти соглашения, вы сможете легче отличить вызовы от статических методов от вызовов к методам экземпляра. –

+0

Спасибо за совет JB Nizet, я постараюсь придерживаться этого. В Erlang это как раз наоборот, переменные начинаются с капиталов, а функции начинаются с строчных букв ... еще одно изменение для меня, чтобы привыкнуть. –

+0

переменная и функции начинаются с строчной буквы в java. классы и перечисления начинаются с верхнего регистра. также обратите внимание, что ваш вызов «findViewById» не рекомендуется из-за его большого цикла. подумайте о сохранении массива/списка элементов, о которых вы знаете, о представлениях, которые вы хотите обработать. если вы хотите, вы можете иметь идентификаторы с именем «edittext1», «edittext2», ... и использовать getidentifier для получения своего идентификатора, а затем переходить через них в цикле и останавливаться, когда вы не получаете их Я бы . –

ответ

0

Я не буду комментировать специфические проблемы Android. Только на общую ошибку компиляции, которую вы получаете. Давайте рассмотрим пример:

public class User { 
    private String name; 

    public User(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return this.name; 
    } 
} 

Чтобы иметь возможность вызвать метод GetName(), вам нужен экземпляр пользователя:

User john = new User("John"); 
String johnsName = john.getName(); 

Что вы делаете вызов метода GetName() без любой экземпляр пользователя:

String someName = User.getName(); 

Это не имеет смысла. У вас нет пользователя. Только класс пользователя.

Как отмечено в моем комментарии; переменные должны начинаться с строчной буквы. Классы начинаются с буквы верхнего регистра.Если вы уважаете это соглашение, все становится яснее:

john.getName(); // instance method call on object john, of type User. 
User.getName(); // static method call on User class. 
+0

Спасибо, это имеет смысл. Теперь моя проблема в том, что мне нужно открыть пользователя с именем == «Джон». Есть ли способ сделать это? –

Смежные вопросы