我正在谷歌的Udacity上学习Android课程,以学习Android和Java。目前,我正在开发的项目是构建一个代表咖啡订购的应用程序。有一个数量的TextView,以及一个+和 - 按钮,在点击时可以增加或减少数量,还有一个提交订单按钮,它会调用打印订单摘要的方法。
不幸的是,我丢失了该应用的原始源代码,所以我尝试自己重建它。我得到了它的工作,但不是我最初设计它的方式。我遇到的问题是,如果我引用TextView来存储在自己的方法之外订购的咖啡数量,那么应用程序会因NullPointerException而立即崩溃。但是,如果我通过创建一个名为display(int number)的方法引用TextView,那么应用程序运行正常。导致此NullPointerException的原因是什么?我在下面提供了两个源代码的链接,其中一个工作正常,另一个工作正常崩溃。
的NullPointerException: https://gist.github.com/CalebF98/eeb7d4144b831b247264ad6a3de0cb76 在此代码中崩溃应用程序的部分位于MainActivity.java文件中的第18行
工作正常: https://gist.github.com/CalebF98/906967d4ebe8ae4d1293a0a13b01f477 在这一行中,在第37-39行,我创建了一个方法,该方法保存相同的代码以引用TextView,如上例所示,稍后由+和 - 按钮的方法调用。
谢谢!
答案 0 :(得分:1)
findViewById
要求Activity
在onCreate(Bundle)
在第一个代码示例中,您正在使用ID"数量"初始化TextView
。在onCreate
方法之外,因此在创建Activity
对象时会初始化它。此时,没有根View
,因此findViewById
方法正在尝试在视图层次结构中搜索所需的TextView
,但根视图为null
。
在第二个代码示例中,findViewById
仅在onClick
方法中调用,因此在视图层次结构膨胀之后才能调用它,因此一切正常。
答案 1 :(得分: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"/>
您忘记将id放在第一个文本视图中。希望将id添加到第一个文本视图可以解决问题