相信很多像我一樣的新手學習ANDROID開發會遇到這個問題,通過這幾天的歸類和總結,將我的理解寫在下面,歡迎大家一起前來討論:
以按鈕BUTTON的監聽事件為例,以下的監聽實現都是等價的:
1.使用接口繼承按鈕監聽方法:
- package?dickren123.hui.say_hello_to_world;??
- ??
- import?android.app.Activity;??
- import?android.os.Bundle;??
- import?android.view.View;??
- import?android.widget.Button;??
- import?android.widget.TextView;??
- /*?這里接口繼承的方法是隸屬于按鈕BUTTON的,因此前面導入的頭文件只需有BUTTON即可*/??
- public?class?Hello_to_worldActivity?extends?Activity?implements?Button.OnClickListener{??
- /**?Called?when?the?activity?is?first?created.?*/??
- private?Button?btn_say_hello;??
- private?TextView?hello_world;??
- @Override??
- public?void?onCreate(Bundle?savedInstanceState)?{??
- super.onCreate(savedInstanceState);??
- setContentView(R.layout.main);??
- btn_say_hello?=?(Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);??
- hello_world?=?(TextView)findViewById(R.id.textView1);??
- btn_say_hello.setOnClickListener(this)?;//由于該類繼承了BUTTON的監聽,???
- }?//因此設置監聽的參數只需傳本類的對象即可???
- public?void?onClick(View?v)?{??
- //?TODO?Auto-generated?method?stub???
- hello_world.setText("dickren123!");//抽象接口的內部方法的實現???
- }??
- }??
?
2.使用接口繼承view類的監聽方法
- package?dickren123.hui.say_hello_to_world;??
- ??
- ??
- import?android.app.Activity;??
- import?android.os.Bundle;??
- import?android.view.View;??
- import?android.view.View.OnClickListener;/*?導入的頭文件需要有view類監聽*/??
- import?android.widget.Button;??
- import?android.widget.TextView;??
- ??
- ??
- public?class?Hello_to_worldActivity?extends?Activity?implements?OnClickListener{??
- ????/**?Called?when?the?activity?is?first?created.?*/??
- private?Button?btn_say_hello;??
- private?TextView?hello_world;??
- ????@Override??
- ????public?void?onCreate(Bundle?savedInstanceState)?{??
- ????????super.onCreate(savedInstanceState);??
- ????????setContentView(R.layout.main);??
- ????????btn_say_hello?=?(Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);??
- ????????hello_world?=?(TextView)findViewById(R.id.textView1);??
- ????????btn_say_hello.setOnClickListener(this)?;//由于該類繼承了view的監聽,???
- ????}?//因此設置監聽的參數只需傳本類的對象即可???
- public?void?onClick(View?v)?{??
- //?TODO?Auto-generated?method?stub???
- hello_world.setText("dickren123!");//抽象接口的內部方法的實現???
- }??
- }??
?
3.不用接口,在類內部直接實現監聽
- package?dickren123.hui.say_hello_to_world;??
- ??
- import?android.app.Activity;??
- import?android.os.Bundle;??
- import?android.view.View;??
- import?android.widget.Button;??
- import?android.widget.TextView;??
- ??
- public?class?Hello_to_worldActivity?extends?Activity?{??
- /**?Called?when?the?activity?is?first?created.?*/??
- private?Button?btn_say_hello;??
- private?TextView?hello_world;??
- @Override??
- public?void?onCreate(Bundle?savedInstanceState)?{??
- super.onCreate(savedInstanceState);??
- setContentView(R.layout.main);??
- btn_say_hello?=?(Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);??
- hello_world?=?(TextView)findViewById(R.id.textView1);??
- btn_say_hello.setOnClickListener(new?Button.OnClickListener(){??
- public?void?onClick(View?v)?{?//使用匿名的Button實例???
- //?TODO?Auto-generated?method?stub???
- hello_world.setText("dickren123!");//抽象接口的內部方法的實現???
- }??
- })?;??
- }???
- }??
?
如果不使用匿名實例,也可以定義一個具體的實例,如下:
- package?dickren123.hui.say_hello_to_world;??
- ??
- import?android.app.Activity;??
- import?android.os.Bundle;??
- import?android.view.View;??
- import?android.widget.Button;??
- ??
- public?class?Hello_to_worldActivity?extends?Activity?{??
- /**?Called?when?the?activity?is?first?created.?*/??
- private?Button?btn_say_hello;??
- ??
- @Override??
- public?void?onCreate(Bundle?savedInstanceState)?{??
- super.onCreate(savedInstanceState);??
- setContentView(R.layout.main);??
- btn_say_hello?=?(Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);??
- btn_listener?bl?=?new?btn_listener();??
- btn_say_hello.setOnClickListener(bl);?//bl是類btn_listener的實例,而btn_listener為監聽方法的接口???
- }?//因此設置監聽的參數只需傳本類的對象即可???
- }??
- class?btn_listener?implements?Button.OnClickListener??
- {??
- public?void?onClick(View?v)?{??
- //?TODO?Auto-generated?method?stub???
- ??
- }??
- }??
Button和View是繼承關系
所以Button的監聽,Button.OnClickListener View.OnClickListener都可以。
但是如果是其他View,就不能用Button.OnClickListener ,而要用View.OnClickListener或者對應的監聽器。