Как мне объявить «Поля членов» в Java? - PullRequest
1 голос
/ 11 мая 2010

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

public class NoteEdit extends Activity {

private Object mTitleText;
private Object mBodyText;

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

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

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

UPDATE

Меня попросили показать, где эти поля инициализируются, вот еще один фрагмент кода, надеюсь, что это полезно ...

@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);

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

Ответы [ 7 ]

7 голосов
/ 11 мая 2010

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

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

private EditText mTitleText;

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

0 голосов
/ 11 мая 2010

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

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

0 голосов
/ 11 мая 2010

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

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

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

0 голосов
/ 11 мая 2010

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

0 голосов
/ 11 мая 2010

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

mTitleText = findViewById( R.id.yourviewid );

и затем

mTitleText.setText(title);
0 голосов
/ 11 мая 2010

Ваше поле mBodyText должно быть набрано, чтобы разрешить доступ к методу setText.

например:

private BodyText mBodyText;
0 голосов
/ 11 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...