2010-06-26 88 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