2017-02-21 6 views
-2

Я занимаюсь изучением Android-приложений на Udacity для изучения Android и Java. В настоящее время проектом, над которым я работаю, является создание приложения, которое представляет заказ кофе. Существует некоторое количество TextView, а также кнопка + и -, которая нажимает либо увеличивать или уменьшать количество, либо кнопку отправки заказа, которая вызывает метод, который выводит сводку заказа.Почему включение этого кода в функцию не вызывает исключение нулевого указателя?

К сожалению, я потерял исходный код для приложения, поэтому я попытался перестроить его самостоятельно. Я получил его на работу, но не так, как я его изначально разработал. Проблема, с которой я сталкиваюсь, заключается в том, что если я ссылаюсь на TextView, в котором хранится количество кофе, заказанных вне его собственного метода, приложение сразу же вылетает из-за исключения NullPointerException. Однако, если я ссылаюсь на TextView, создав метод, называемый display (int number), приложение работает нормально. Что вызывает это исключение NullPointerException? Я привел ссылки ниже к двум исходным кодам, один из которых отлично работает, а другой из них немедленно сбой.

NullPointerException: https://gist.github.com/CalebF98/eeb7d4144b831b247264ad6a3de0cb76 Та часть, которая происходит сбой приложения в этом коде в строке 18 в MainActivity.java файле

работает отлично: https://gist.github.com/CalebF98/906967d4ebe8ae4d1293a0a13b01f477 В этом, на линиях 37-39, я создайте метод, который содержит тот же код для ссылки на TextView, как в приведенном выше примере, который затем вызывается методами для кнопок + и -.

Спасибо!

+1

Потому что это вне метода onCreate. – Hareesh

+3

Пожалуйста, поместите соответствующий код в вопрос, не просто ссылку на него за пределами площадки. – EJoshuaS

+0

Извините, я все еще привык к публикации кода, я не был уверен, что уместно или нет. Мои извинения. –

ответ

1

findViewById требует, чтобы Activity раздуло в XML в onCreate(Bundle)

В первом примере кода, вы инициализации TextView с «количеством» ид вне onCreate, поэтому он будет инициализироваться при создании объекта Activity. В этот момент нет корня View, поэтому метод findViewById пытается найти иерархию представления для нужного TextView, но корневой вид null.

Во втором примере кода findViewById вызывается только в методах onClick, поэтому его нельзя вызвать до тех пор, пока иерархия представления не будет завышена, поэтому все будет в порядке.

0
<TextView 
    android:text="Order Summary" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="16dp" 
    android:textAllCaps="true"/> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="16dp" 
    android:id="@+id/order_summary" 
    android:text="$0"/> 

Вы забыли указать идентификатор для первого текстового вида. Надежда, добавив идентификатор в первом текстовом виде исправляет проблему

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