2010-10-26 7 views
2

Я пытаюсь создать простой пример кнопки, но когда я добавить этот код:не r.id регенерировать

mButton = (Button) findViewById (R.id.button1);

это не обновит мой файл R.id. Я пробовал все, включая автоматическую сборку, очистку проекта и обновление SDK. Это происходит в проектах с 1,6 и 2,2.

Вот что полный код выглядит как:

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 

public class NewTest extends Activity { 

Button myButton; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     myButton = (Button) findViewById(R.id.button1); 
    } 
} 
+0

Скорее всего, один из ваших макетов XML имеет ошибку, опубликовать его, чтобы проверить, но прежде чем сделать это попытаться очистить проект, в затмении пойти, проект -> clean -> выбрать проект -> очистить. – blindstuff

ответ

2

findViewById ищет файл R.id для местоположения, на которое вы ссылаетесь.

Ваш код не приведет к обновлению файла, поскольку он ищет только кнопку.

Создание кнопки в макете приведет к обновлению файла R.id.

<Button 
    android:id="@+id/button1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Button One"/> 

Как вы используете findViewById в контексте, и вид для текущего контекста main.xml, приведенный выше пример кнопки нужно будет находиться внутри файла main.xml. В противном случае, если бы у вас была другая кнопка с тем же именем в другом макете .xml, запись будет сделана в вашем файле R.id, но ваш код даст вам исключение с нулевым указателем, потому что кнопка не существует в том контексте, в котором вы находитесь пытаясь ссылаться на него.

0

Поскольку вы используете макет на основе XML убедитесь, что у вас есть андроида: ID атрибут в файле main.xml с «@ + ид/button1 "в качестве значения .......

0

Он не будет обновлять сгенерированный файл R.java, когда вы только обратитесь к к существующему идентификатору.

Он обновляется только после того, как вы добавьте ресурс. button01 должен уже существовать в одном из ваших .xml-файлов, иначе ваш 'findViewById (R.id.button1)' не будет компилироваться.

2

Убедитесь, что надлежащий импорт для класса R вашего приложения в вашей деятельности:

import your.app.package.R; 

UPDATE: это неявный импорт необходим только если ваш класс активности не в корне your.app.package пакета.

+0

Это не так, как это работает. Вы не можете импортировать R, как это, или он не будет работать вообще. – Falmarri

+0

Ну, если я прокомментирую импорт R, тогда моя '(Button) findViewById (R.id.acceptBtnTop)' перестает работать. Поэтому я уверен, что без импорта автогенерированного класса R приведенный выше код не будет работать. Поскольку код в главном сообщении не содержит импорт R, я предложил проверить его. –

+0

О, моя ошибка. Я думал, что вы делаете 'import android.R'. Потому что это не сработает. Что касается вышеизложенного, это не нужно. Вам не нужно импортировать классы в свой пакет. Я не могу изменить свой downvote, если вы не отредактируете вопрос – Falmarri

0

У меня была такая же проблема с использованием API 19 с редактором макета, установленным на API 15, при попытке следовать учебнику NotePadV1. Я не мог получить файл R.id.text1 для компиляции из файла notes_row.xml.

Первоначально, я только что вложил текст в XML-файл, чтобы сгенерировать макет. После безуспешной попытки удаления R и очистки, я попытался полностью удалить макет notes_row. Когда я воссоздал макет, я использовал графический интерфейс, чтобы добавить свойства объекта TextView, просто Id @ + id/text1, ширину и высоту. Затем я сделал «Чистый» и скомпилировал. Это сработало.

+0

Чтобы быть ясным, я удалил макет и воссоздал его. – Steve

1

Сохранить свой проект перед использованием R.id.something

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