2010-05-10 2 views
1

Этот вопрос, вероятно, показывает мою полную нехватку знаний на Java. Но позвольте мне показать вам, что я думал, что правильный способ объявить «член поля»:Как объявить «поля пользователя» в Java?

public class NoteEdit extends Activity { 

private Object mTitleText; 
private Object mBodyText; 

Я следую блокнот учебнику компании Google для Android (here), и они просто сказали: «Обратите внимание, что mTitleText и mBodyText являются полями-членами (вам нужно объявить их в начале определения класса). " Я думал, что понял, а потом понял, что этот маленький фрагмент кода не работает.

if (title != null) { 
      mTitleText.setText(title); 
     } 
     if (body != null) { 
      mBodyText.setText(body); 
     } 

Так как я не ставил на «поля-членов» правильно, который я думал, все, что нужно было объявить их частные объекты в верхней части класса Noteedit или я пропускаю что-то другое. Заранее благодарю за любую помощь.

UPDATE

меня попросили показать, где эти поля были intialized здесь еще один фрагмент кода надеюсь, что это полезно ...

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.note_edit); 
    Long mRowId; 
    mTitleText = (EditText) findViewById(R.id.title); 
    mBodyText = (EditText) findViewById(R.id.body); 

Так в основном ошибка, которая появляется в начиная с eclipse: «Метод setText (String) не определен для типа Object«

+1

Вам нужно больше кода, чтобы помочь вам. Где, например, инициализируется mTitleText? У вас должно быть 'mTitleText = something' где-то – aioobe

+0

Посмотрите три строки над надписью« Обратите внимание, что бит mTitleText и mBodyText являются битными полями. Вот где они назначаются, и это та часть, которую вам не хватает. –

+1

«этот маленький фрагмент кода не работал» - компилировать ошибку? Ошибка выполнения? Детали? Код, конечно, выглядит отлично (без контекста). – Dolph

ответ

7

При объявлении полей и переменных, это обычно полезно, чтобы дать им более конкретный static type чем объект , Поскольку вы объявили mTitleText как Object, компилятор знает, как вызывать методы на общем Object class definition. setText - это не такой метод, поэтому назвать его без аккордов или других обманщиков законно.

Что вам нужно сделать, это выяснить, какой тип поля должен быть. Я не знаю Android, но я предполагаю, что есть класс текстовых меток, который определяет ваш метод setText. Если вы измените поля должны быть определены, как,

private EditText mTitleText; 

вы обнаружите, что все должно работать намного лучше :-)

+0

На самом деле одной из основных целей дизайна java было обеспечение надежного, строго типизированного языка. – Justin

+0

Спасибо, господин Шланскер за ваш быстрый ответ. – Bub

+0

Вы не должны прогонять венгерскую нотацию в своем примере кода. –

0

Если вы не установили эти два поля в другом месте, они не инициализируются. Поэтому, когда вы используете их позже, они являются null и вызывают исключения. Типы ссылок Java инициализируются до null. Основные типы данных, которые не являются null, могут быть инициализированы до 0.

0

Ваше поле mBodyText должно быть введено для доступа к методу setText.

например:

private BodyText mBodyText; 
0

ее не работает, потому что ваши объекты не инициализируются. mTitleText текст должен быть TextView , то вам необходимо инициализировать его

mTitleText = findViewById(R.id.yourviewid); 

, а затем сделать

mTitleText.setText(title); 
0

Они помечены как частные, так что вы не можете с ними за пределами вашего класса ,Если вы хотите получить доступ за пределами своего класса, вы должны использовать ключевое слово public перед своим полем. НО это не рекомендуется использовать свойства вместо

0

В этом случае вам нужно назначить значения для двух переменных-членов. Я считаю, что класс NoteEdit имеет связанный с ним XML-файл макета. Вам необходимо назначить объекты текстового поля из этого макета для объектов, прежде чем пытаться ссылаться на их свойства.

mTitleText = (TextView) findViewById(R.id.name_of_the_field_in_the_layout_file) 

Ответ также верен. Вы должны назначать типы этим переменным в верхней части своего класса, а не просто делать их Objects

0

Объявление названия и типа ссылки - это одно; инициализация его, чтобы указать на действительную ячейку памяти в куче, является другой. Вам необходимо инициализировать элементы данных в конструкторе для вашего класса.

По умолчанию конструктор инициализирует ссылки на нуль по умолчанию. Если вы не создали конструктор для инициализации ссылок на данные, это может быть объяснением, почему у вас возникают проблемы.

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