假設你有兩個元件要建立事件 
也許你會這樣做
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<button.length;i++){
    button[i].setOnClickListener(mOnClickListener);
}如果你想改事件, 那麼就直接改裡面的事件囉, 
所以看情況來決定使用的方法才是一個重點!