→ nonebelieve:其實你可以推文或寄站內信感謝他就好.. 01/10 11:32
※ 引述《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
首先感謝G大的詳細說明,呵呵~感激不盡。
說到最後,其實這兩種方式相似度99%。哈哈~
匿名類別的寫法,跟匿名物件(有點模糊@@)這兩者之間我想我應該再多花點時間了解~
最後~感謝您。0.0