【Android(安卓)开发教程】注册事件监听器
16lz
2021-01-25
本章节翻译自《Beginning-Android-4-Application-Development》,如有翻译不当的地方,敬请指出。
原书购买地址http://www.amazon.com/Beginning-Android-4-Application-Development/dp/1118199545/当用户与视图views进行交互的时候,views也会触发事件。举个例子,当用户点击了一个按钮,你需要为这个事件服务,只有这样,才能去执行某些适当的行为。如果想这么做的话,你就需要为视图views注册监听。
使用上一节中的例子,在activity中有两个Button。我们可以使用一个匿名的类,为按钮设置点击事件。
[java] view plain copy- publicclassUIActivityActivityextendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //---thetwobuttonsarewiredtothesameeventhandler---
- Buttonbtn1=(Button)findViewById(R.id.btn1);
- btn1.setOnClickListener(btnListener);
- Buttonbtn2=(Button)findViewById(R.id.btn2);
- btn2.setOnClickListener(btnListener);
- }
- //---createananonymousclasstoactasabuttonclicklistener---
- privateOnClickListenerbtnListener=newOnClickListener()
- {
- publicvoidonClick(Viewv)
- {
- Toast.makeText(getBaseContext(),
- ((Button)v).getText()+"wasclicked",
- Toast.LENGTH_LONG).show();
- }
- };
- @Override
- publicbooleanonKeyDown(intkeyCode,KeyEventevent)
- {
- switch(keyCode)
- {
- caseKeyEvent.KEYCODE_DPAD_CENTER:
- Toast.makeText(getBaseContext(),
- "Centerwasclicked",
- Toast.LENGTH_LONG).show();
- break;
- caseKeyEvent.KEYCODE_DPAD_LEFT:
- Toast.makeText(getBaseContext(),
- "Leftarrowwasclicked",
- Toast.LENGTH_LONG).show();
- break;
- caseKeyEvent.KEYCODE_DPAD_RIGHT:
- Toast.makeText(getBaseContext(),
- "Rightarrowwasclicked",
- Toast.LENGTH_LONG).show();
- break;
- caseKeyEvent.KEYCODE_DPAD_UP:
- Toast.makeText(getBaseContext(),
- "Uparrowwasclicked",
- Toast.LENGTH_LONG).show();
- break;
- caseKeyEvent.KEYCODE_DPAD_DOWN:
- Toast.makeText(getBaseContext(),
- "Downarrowwasclicked",
- Toast.LENGTH_LONG).show();
- break;
- }
- returnfalse;
- }
- }
除了定义一个匿名类,也可以定一个匿名内部类去处理事件。下面的例子展示如何处理EditText的onFocusChange()方法。
[java] view plain copy- //---createananonymousinnerclasstoactasanonfocuslistener---
- EditTexttxt1=(EditText)findViewById(R.id.txt1);
- txt1.setOnFocusChangeListener(newView.OnFocusChangeListener()
- {
- @Override
- publicvoidonFocusChange(Viewv,booleanhasFocus){
- Toast.makeText(getBaseContext(),
- ((EditText)v).getId()+"hasfocus-"+hasFocus,
- Toast.LENGTH_LONG).show();
- }
- });
也可以使用匿名内部类,为两个Button设置监听。
[java] view plain copy- //---thetwobuttonsarewiredtothesameeventhandler---
- Buttonbtn1=(Button)findViewById(R.id.btn1);
- //btn1.setOnClickListener(btnListener);
- btn1.setOnClickListener(newView.OnClickListener(){
- publicvoidonClick(Viewv){
- //---dosomething---
- }
- });
- Buttonbtn2=(Button)findViewById(R.id.btn2);
- //btn2.setOnClickListener(btnListener);
- btn2.setOnClickListener(newView.OnClickListener(){
- publicvoidonClick(Viewv){
- //---dosomething---
- }
- });
那么,到底该使用哪种方法去为视图设置监听呢?当你需要使用一个监听器去为多个视图服务的时候,匿名类就很有用处了。如果你只需要为单一的视图设置监听,那么就使用匿名内部类吧。
更多相关文章
- Android(安卓)游戏开发中 OnTouchEvent() 触屏事件的性能优化
- 安卓seekBar的使用(初学者)
- Android触摸事件(三)-触摸事件类使用实例
- LayoutInflater那些事儿
- Android(安卓)左侧抽屉 +点击事件
- Android(安卓)Material Design Library系列教程(三)
- [置顶] Android(安卓)ListView 基础入门 简介以及深入优化
- 【android studio】解决layout预览出现Rendering Problems Excep
- Android:解决TextView设置textIsSelectable=true后,第一次点击无