看板 AndroidDev 關於我們 聯絡資訊
首先感謝G大的詳細說明,呵呵~感激不盡。 說到最後,其實這兩種方式相似度99%。哈哈~ 匿名類別的寫法,跟匿名物件(有點模糊@@)這兩者之間我想我應該再多花點時間了解~ 最後~感謝您。0.0 ※ 引述《givemepass (〆)》之銘言: : ※ 引述《sweet00914 (別理我)》之銘言: : : MyListener ml=new MyListener(); : : F1 = (Button) findViewById(R.id.bottomBtnF1); : : F1.setOnClickListener(ml); : : private class MyListener implements OnClickListener{ : : public void onClick(View v) { : : } : : } : : ========================================================== : : F1 = (Button) findViewById(R.id.bottomBtnF1); : : F1.setOnClickListener(btnclick); : : private OnClickListener btnclick=new OnClickListener(){ : : public void onClick(View v) { : : } : : } : : 上述兩種寫法均可執行,第一種方式是將onClick的事件以Class來表示, : : 第二種方式是以function來表示。 : : 請問大家此兩種寫法在android上還有其他涵義嗎?謝謝 : 假設你有兩個元件要建立事件 : 也許你會這樣做 : 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 class 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(myOnClickListener1); : button2.setOnClickListener(myOnClickListener2); : } : private class OnClickListener myOnClickListener1 : = new MyOnClickListener1(){ : public void onClick(View v){ : textView1.setText("textview1"); : } : } : private class OnClickListener myOnClickListener2 : = new MyOnClickListener2(){ : 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"); : } : }); : } : } : 整個世界乾淨多了! : 現在你知道為什麼要這樣寫了嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.55.241
nonebelieve:其實你可以推文或寄站內信感謝他就好.. 01/10 11:32