2012-03-23 2 views
0

Я пытаюсь создать очень простой макет списка, следуя приведенным здесь примерам CommonsWare: http://www.commonsware.com/Android/excerpt.pdf. Вот мои соответствующие файлы:Загадочная (?) Ошибка в XML-макете

RateListDemo.java

package my.ratelist; 

import android.app.ListActivity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 

public class RateListDemo extends ListActivity { 

private static final String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", 
    "elit", "morbi", "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", 
    "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"}; 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setListAdapter(new ArrayAdapter<String>(this, R.layout.row, R.id.label, items)); 
    setContentView(R.layout.list); 
} 
} 

list.xml

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

<ListView android:id="@android:id/list" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

</RelativeLayout> 

row.xml

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" > 

<RatingBar 
    android:id="@+id/rate" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:numStars="3" /> 

<TextView 
    android:id="@+id/label" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

</LinearLayout> 

Так вот действительно странно. Этот код работает нормально. Однако, если я удаляю элемент RatingBar из row.xml и оставляю только элемент TextView, тогда он запускает фатальные ошибки при запуске. Это не имеет для меня никакого смысла, тем более, что у меня есть другое приложение, которое запускает очень похожую схему компоновки без проблем. Как вы можете видеть, ссылки на код RatingBar отсутствуют в другом месте кода. Кроме того, если я переключу порядок элементов RatingBar и TextView в row.xml, он выдаст ту же ошибку. В чем дело?

Исходное сообщение об ошибке - это NullPointerException в файле android.widget.ArrayAdapter.createViewFromResource. Я могу предоставить весь журнал, если это поможет.

EDIT:

Гм, ну, после попытки запустить его в этих различных конфигурациях компоновки и неоднократно получать фатальные ошибки, все они сейчас работают. Но я ничего не менял, кроме как попытаться запустить его несколько раз. Я чувствую, что это случилось со мной раньше с XML. Итак, остается вопрос: WTF?

+0

Вы очистили проект после перемещения или снятия заказа вашего RatingBar? Я думаю, что идентификатор класса R не всегда регенерируется после изменений в XML, когда вы пытаетесь запустить проект, поэтому он может все еще иметь старую ссылку на этот измененный объект ... и это объясняет, почему после нескольких попыток он начинает работать. – Adinia

+0

Да, это определенно кажется, что на работе есть какая-то проблема с артефактом. Мне никогда не приходилось чистить проекты раньше, но я попробую в следующий раз. – osweetman

ответ

0

Как я уже сказал, я попробовал это снова, получил ту же фатальную ошибку и затем «очистил» проект. Это, похоже, устранило проблему.

0

(Обычно вы должны отправлять трассировку стека, когда у вас есть.) Я уже могу догадаться, что это такое, но это довольно просто. Код относится к этому RatingBar и манипулирует им. Когда вы удаляете его, код появляется с null, когда он его просматривает, и возникает ошибка.

+0

Ну, это был бы очевидный ответ, и это было первое, что я изучил. Помимо трех файлов выше, есть strings.xml и манифест. Они имеют нулевые ссылки на RatingBar. Как я уже сказал, это ОЧЕНЬ простой макет. Я отключил его, чтобы попытаться выявить эту ошибку. На данный момент, RatingBar только для езды. Кроме того, как я уже сказал, сохранение RatingBar, а просто переключение порядка элементов в макете также приводит к фатальной ошибке. – osweetman

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