为什么这会让我的应用程序崩溃以及什么是合适的解决方案?

时间:2015-01-10 21:02:35

标签: android

我有一个按钮,我想经常更改它的值,所以我的Activity有一个私有变量:

private Button p1_button = (Button)findViewById(R.id.firstbut);

这个简单的行使我的应用程序崩溃。如果我放入onCreate它可以工作,我可以与按钮交互(更改文本等)。

编辑:我想我找到了原因。我应该初始化AFTER setcontentview?

编辑:谢谢你的建设性答案。我现在有一个不同的问题,我删除了初始化,我在onCreate上做了它并且它工作(但我把p1_button声明保持为私有字段)。但是当我尝试用我的活动的另一种方法修改按钮(只是更改文本)时,它再次崩溃。所以findViewById的返回值是" local"到调用它的方法,我应该在访问UI元素的每个方法中设置内容视图?

3 个答案:

答案 0 :(得分:1)

在之后 findViewById()之前,请不要致电setContentView()。否则,小部件将不存在。

更一般地说, not Activity之后调用继承的方法,直到super.onCreate()之后,除非特别建议这样做。

答案 1 :(得分:0)

这取决于您呼叫此线路的位置。 http://i.stack.imgur.com/6EQaU.png onCreate()方法包含对setContentView()的调用,在调用它之前,Android不知道如何处理你的按钮,因为它还没有膨胀!

因此,作为一个非常简单的经验法则,请始终确保已调用并完成setContentView(或者如果您正在处理片段onCreateView())。只有这样才能找到ViewById()。

如果您想获得进一步的指导,请发布一些发生崩溃的代码。

编辑:我尝试正确添加图片,但没有足够的代表。

答案 2 :(得分:0)

要了解这一点,您需要了解活动生命周期。您正试图查看尚未由Android创建的view

根据此处解释的Android生命周期" http://developer.android.com/training/basics/activity-lifecycle/starting.html"。在onCreate()方法中,活动已创建,您可以访问活动的不同view个。如果您在view之前尝试查找onCreate(),则应用会崩溃,因为它不知道该视图是否存在。