2010-06-26 85 views
2

当我尝试初始化全局范围内的Button和EditText对象时,我收到空指针异常,无法弄清楚。我注释掉一切,但最起码​​的应用程序,以显示我的布局,但仍导致系统崩溃:设置全局按钮和EditText对象

private EditText addmoney = (EditText)findViewById(R.id.addmoney); 

R.id.addmoney绝对,绝对存在。那到底是什么?是不可能在全局范围内声明EditText?我需要能够从一个类扩展Activity中的onCreate和onPause中调用它,还有另一种方法,我应该这样做吗?

编辑:

我试图用第一膨胀布局遮阳的方法,但它造成的错误,显然你不允许的onCreate之前使用的系统服务()被调用和充气视图需要一个。

+0

内容视图(XML)你通过你的setContentView活动设置需要保持的EditText元素R.id.addmoney。 您可以在设置内容视图的位置粘贴活动的代码。也可能是相关的xml布局。 – 2010-06-26 08:29:52

+0

对于我的方法来说,你需要一个活着的上下文。调用super.onCreate(Bundle)后,上下文变为活动状态。顺便说一句,您可以使用任何上下文(来自任何活动)或ApplicationContext,只要它们处于活动状态即可。 – Shade 2010-06-29 13:25:08

回答

2

或者,你可以做这样的事情:

private View dummy = (View) View.inflate(this, R.layout.dummy, null); 
private EditText addmoney = (EditText) dummy.findViewById(R.id.addmoney); 

...并在OnCreate(或任何其他地方):

setContentView (dummy); 

既然你已经拥有的父实例化EditText视图,您可以在不具有NPE的情况下引用它。

:的第一个参数膨胀语境。因此,你需要一个活着的上下文来工作。

  • 哎呀,错误的类:d
3

只有在为当前活动设置内容后,才必须执行findViewById

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 
    addmoney = (EditText)findViewById(R.id.addmoney);//it knows in which file to search for the id 
} 
+0

的确,这是因为活动需要知道应该使用哪个'R.id.addmoney'元素。可能具有相同ID的相同元素可能存在于其他布局中。这就是为什么'setContentview(...)'必须先被调用的原因。 – Juri 2010-06-26 08:36:34

+0

@Juri:实际上比这更简单。 'findViewById'在您的视图层次结构中执行简单的树遍历。如果没有视图层次结构,那么不仅无法找到,而且无处开始遍历。 – adamp 2010-06-26 15:56:37