2009年5月29日 星期五

使用findViewById傳回Null及Android重構

今天在寫Android的時候,使用findViewById尋找layout上的物件
原本好好的,但是想不到重構後變成不會跑了,後來用logcat看了一下
原來是findViewById回傳了null的物件,結果丟出NullPointerException
重構前程式

private EditText _width;
private EditText _height;
...
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
_width=(EditText)findViewById(R.id.width_text);
_height=(EditText)findViewById(R.id.height_text);
}

重構後程式

private EditText _width;
private EditText _height;
...
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
findView();
setContentView(R.layout.main);

}
private void findView(){
_width=(EditText)findViewById(R.id.width_text);
_height=(EditText)findViewById(R.id.height_text);
}

------------
原來是我把findViewById的動作移到了 setContentView(R.layout.main);之前
在Android如果在使用setContentView把顯示元件創造出來之前
findViewById是找不到任何東西的,所以必須把findViewById的動作放到setContentView之後


這邊順便介紹一下,在Android裡有提供一個好用的重構工具:Extract Android String
在Android通常會把常數字串放到string.xml裡面存取,而當我們寫程式的時候通常很懶的再把東西寫到另外一個檔案裡面,這個工具可以簡單替我們辦到
而這項重構工具在Refactor->Android->Extract Android String




順便筆記一下,如果想存取string.xml,也就是R.string之下的東西,必須配合getText函式

_result.setText(getText(R.string.data);

沒有留言: