假設你有兩個元件要建立事件
也許你會這樣做
不! 你不能這樣做, 因為你不能在同一個類別內實作同一個方法兩次,
而且你會被編譯器擋下, 那怎麼辦呢?
也許可以這樣做
甚至比較乾淨的做法是
最後在補上
看起來似乎不錯, 但是萬一某一天我想要改變某個動作,
那又等重新修改整段程式碼的事件, 也許手殘會把其他的事件弄亂,
這樣一點也不好。
那如果這樣呢? 分別寫在不同的類別
你會被編譯器擋下來, 因為在MyOnClickListener1和MyOnClickListener2並不存在
textView1跟textView2這兩個類別成員。
所以我們又想到一個好辦法, 那就是把事件類別寫在我們要處理事件的類別內,
改成這樣就沒問題了!
類別內的類別稱作inner class, 那inner class稱呼包著它的類別就叫做outer class,
inner class可以使用outer class的任何成員,就算是private的也是可行,
如上面的例子, 內部類別可以取用textView1,textView2。
但是!
寫程式總是會想要偷懶, 少寫幾行又能完成相同的功能,
那我們就會開始想辦法偷懶,
你有沒有發現每次都要宣告類別, 定義要處理的事件,
然後在宣告實體, 最後將實體配置給某個元件的監聽器,
有夠麻煩的, 因此我們就會會想,
不如把定義事件跟宣告該事件類別的物件一起寫,
這樣不就方便多了?
所以改成這樣, 也許會好一點!
嗯...看起來少寫幾行的感覺真爽!
但是全聯先生說:省還可以更省。
如果我們再將定義事件類別宣告的變數省起來,
直接寫進setOnClickListener, 不是更好嗎?
因此終極省法出現了!
整個世界乾淨多了!
現在你知道為什麼要這樣寫了嗎?
我們有時候必須考慮到很多種情況
來挑是否使用匿名類別物件
今天假設你有一百個Button 且 事件內容都相同 這種情況下
就不可能使用匿名類別物件了
因為你會寫到瘋掉
你會說 反正複製貼上而已 很快!
那萬一今天你想修改事件內容呢? 你會改到瘋掉
所以比較好的做法反而是之前的宣告一個事件物件
然後用for迴圈去註冊事件
如果你想改事件, 那麼就直接改裡面的事件囉,
所以看情況來決定使用的方法才是一個重點!
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
textView1 = (TextView)findViewById(R.id.text_view1);
textView2 = (TextView)findViewById(R.id.text_view2);
class MyOnClickListener implements OnClickListener{
public void onClick(View v){
textView1.setText("textview1");
}
public void onClick(View v){
textView2.setText("textview2");
}
}
private MyOnClickListener myOnClickListener = new MyOnClickListener();
button1.setOnClickListener(myOnClickListener);
button2.setOnClickListener(myOnClickListener);
不! 你不能這樣做, 因為你不能在同一個類別內實作同一個方法兩次,
而且你會被編譯器擋下, 那怎麼辦呢?
也許可以這樣做
class MyOnClickListener implements OnClickListener{
public void onClick(View v){
if(v.getId()==R.id.btn1){
textView1.setText("textview1");
}
else if(v.getId()==R.id.btn2){
textView2.setText("textview2");
}
}
}
甚至比較乾淨的做法是
class MyOnClickListener implements OnClickListener{
public void onClick(View v){
switch(v.getId()){
case R.id.btn1:
textView1.setText("textview1");
break;
case R.id.btn2:
textView2.setText("textview2");
break;
}
}
}
最後在補上
private MyOnClickListener myOnClickListener = new MyOnClickListener();
button1.setOnClickListener(myOnClickListener);
button2.setOnClickListener(myOnClickListener);
看起來似乎不錯, 但是萬一某一天我想要改變某個動作,
那又等重新修改整段程式碼的事件, 也許手殘會把其他的事件弄亂,
這樣一點也不好。
那如果這樣呢? 分別寫在不同的類別
public MyActivity extends Activity{
public void onCreate(){
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
textView1 = (TextView)findViewById(R.id.text_view1);
textView2 = (TextView)findViewById(R.id.text_view2);
}
private MyOnClickListener1 myOnClickListener1 = new MyOnClickListener1();
private MyOnClickListener2 myOnClickListener2 = new MyOnClickListener2();
button1.setOnClickListener(myOnClickListener1);
button2.setOnClickListener(myOnClickListener2);
}
class MyOnClickListener1 implements OnClickListener{
public void onClick(View v){
textView1.setText("textview1");
}
}
class MyOnClickListener2 implements OnClickListener{
public void onClick(View v){
textView2.setText("textview2");
}
}
你會被編譯器擋下來, 因為在MyOnClickListener1和MyOnClickListener2並不存在
textView1跟textView2這兩個類別成員。
所以我們又想到一個好辦法, 那就是把事件類別寫在我們要處理事件的類別內,
改成這樣就沒問題了!
public MyActivity extends Activity{
private TextView textView1;
private TextView textView2;
private MyOnClickListener1 myOnClickListener1;
private MyOnClickListener2 myOnClickListener2;
public void onCreate(){
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
textView1 = (TextView)findViewById(R.id.text_view1);
textView2 = (TextView)findViewById(R.id.text_view2);
myOnClickListener1 = new MyOnClickListener1();
myOnClickListener2 = new MyOnClickListener2();
button1.setOnClickListener(myOnClickListener1);
button2.setOnClickListener(myOnClickListener2);
}
class MyOnClickListener1 implements OnClickListener{
public void onClick(View v){
textView1.setText("textview1");
}
}
class MyOnClickListener2 implements OnClickListener{
public void onClick(View v){
textView2.setText("textview2");
}
}
}
類別內的類別稱作inner class, 那inner class稱呼包著它的類別就叫做outer class,
inner class可以使用outer class的任何成員,就算是private的也是可行,
如上面的例子, 內部類別可以取用textView1,textView2。
但是!
寫程式總是會想要偷懶, 少寫幾行又能完成相同的功能,
那我們就會開始想辦法偷懶,
你有沒有發現每次都要宣告類別, 定義要處理的事件,
然後在宣告實體, 最後將實體配置給某個元件的監聽器,
有夠麻煩的, 因此我們就會會想,
不如把定義事件跟宣告該事件類別的物件一起寫,
這樣不就方便多了?
所以改成這樣, 也許會好一點!
public MyActivity extends Activity{
private TextView textView1;
private TextView textView2;
//private MyOnClickListener1 myOnClickListener1;
//private MyOnClickListener2 myOnClickListener2;
public void onCreate(){
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
textView1 = (TextView)findViewById(R.id.text_view1);
textView2 = (TextView)findViewById(R.id.text_view2);
//myOnClickListener1 = new MyOnClickListener1();
//myOnClickListener2 = new MyOnClickListener2();
button1.setOnClickListener(mOnClickListener1);
button2.setOnClickListener(mOnClickListener2);
}
private OnClickListener mOnClickListener1 = new OnClickListener(){
public void onClick(View v){
textView1.setText("textview1");
}
}
private OnClickListener mOnClickListener2 = new OnClickListener(){
public void onClick(View v){
textView2.setText("textview2");
}
}
}
嗯...看起來少寫幾行的感覺真爽!
但是全聯先生說:省還可以更省。
如果我們再將定義事件類別宣告的變數省起來,
直接寫進setOnClickListener, 不是更好嗎?
因此終極省法出現了!
public MyActivity extends Activity{
private TextView textView1;
private TextView textView2;
public void onCreate(){
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
textView1 = (TextView)findViewById(R.id.text_view1);
textView2 = (TextView)findViewById(R.id.text_view2);
button1.setOnClickListener(new MyOnClickListener1(){
public void onClick(View v){
textView1.setText("textview1");
}
});
button2.setOnClickListener(new MyOnClickListener2(){
public void onClick(View v){
textView2.setText("textview2");
}
});
}
}
整個世界乾淨多了!
現在你知道為什麼要這樣寫了嗎?
我們有時候必須考慮到很多種情況
來挑是否使用匿名類別物件
今天假設你有一百個Button 且 事件內容都相同 這種情況下
就不可能使用匿名類別物件了
因為你會寫到瘋掉
Button[] button = new Button[100];
buttton[0].setOnClickListener(new OnClickListener(){
public void onClick(View v){
textView.setText("hello");
}
});
buttton[1].setOnClickListener(new OnClickListener(){
public void onClick(View v){
textView.setText("hello");
}
});
....100次
你會說 反正複製貼上而已 很快!
那萬一今天你想修改事件內容呢? 你會改到瘋掉
所以比較好的做法反而是之前的宣告一個事件物件
然後用for迴圈去註冊事件
private OnClickListener mOnClickListener = new OnClickListener(){
public void onClick(View v){
textView.setText("ya");
}
};
for(int i=0;i
如果你想改事件, 那麼就直接改裡面的事件囉,
所以看情況來決定使用的方法才是一個重點!
No comments:
Post a Comment