Зачем NullPointerException, когда программно добавляю мое текстовое представление? - PullRequest
4 голосов
/ 22 июля 2011

Я программно создал линейный макет в своей Деятельности, как показано ниже:

LinearLayout myContent = new LinearLayout(this);
myContent.setOrientation(LinearLayout.VERTICAL);

Затем я определил текстовое представление в формате xml (под res / layout /), как показано ниже:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/name_text"
    android:layout_width="80dp"
    android:layout_height="40dp"
    android:gravity="center"
/>

После этого я хотел бы добавить несколько TextView, определенных выше, к myContent линейному макету программно, как показано ниже:

//my content is a linear layout
LinearLayout myContent = new LinearLayout(this);
myContent.setOrientation(LinearLayout.VERTICAL);

for(int i=0; i<10; i++){
  //get my text view resource
  TextView nameField = (TextView)findViewById(R.id.name_text);


  nameField.setText("name: "+Integer.toString(i)); //NullPointerException here
}

myContent.addView();

Я думал, что приведенный выше код должен добавить 10 TextView с именем вmyContent линейная планировка.Но я получаю NullPointerException в nameField.setText(...); (см. Код выше). Почему?

PS (обновление)

myContent Линейное расположение добавлено к другому линейномумакет, который определен в main.xml, и моя активность имеет setContentView (R.layout.main)

Ответы [ 4 ]

6 голосов
/ 22 июля 2011

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

например,

View child = getLayoutInflater (). inflate (R.layout.child);
myContent.addView (child);

2 голосов
/ 22 июля 2011

Проблема в этой строке

 TextView nameField = (TextView)findViewById(R.id.name_text);

. См. Несоответствие с написанием в файле макета. Также убедитесь, что setContentView(R.layout.main); Я запустил ваш код. Он работает нормально.

0 голосов
/ 22 июля 2011

Посмотрите на этот Ссылка флажок. Что вы делаете, это создаете макет динамически и с помощью XML, просто выберите один.

0 голосов
/ 22 июля 2011

Вы не вызывали setContentView (...) с файлом макета. Похоже, вы можете создать 10 представлений в коде и применить к ним некоторые стили.

Вы не можете получить доступ к этим 10 представлениям с помощью findViewById (...), поскольку ваш файл макета указывает только одно представление. Вы также можете импортировать этот макет 10 раз в основной файл макета с LinearLayout, определенным как родительское представление.

...