本章节翻译自《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
  1. publicclassUIActivityActivityextendsActivity{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. //---thetwobuttonsarewiredtothesameeventhandler---
  8. Buttonbtn1=(Button)findViewById(R.id.btn1);
  9. btn1.setOnClickListener(btnListener);
  10. Buttonbtn2=(Button)findViewById(R.id.btn2);
  11. btn2.setOnClickListener(btnListener);
  12. }
  13. //---createananonymousclasstoactasabuttonclicklistener---
  14. privateOnClickListenerbtnListener=newOnClickListener()
  15. {
  16. publicvoidonClick(Viewv)
  17. {
  18. Toast.makeText(getBaseContext(),
  19. ((Button)v).getText()+"wasclicked",
  20. Toast.LENGTH_LONG).show();
  21. }
  22. };
  23. @Override
  24. publicbooleanonKeyDown(intkeyCode,KeyEventevent)
  25. {
  26. switch(keyCode)
  27. {
  28. caseKeyEvent.KEYCODE_DPAD_CENTER:
  29. Toast.makeText(getBaseContext(),
  30. "Centerwasclicked",
  31. Toast.LENGTH_LONG).show();
  32. break;
  33. caseKeyEvent.KEYCODE_DPAD_LEFT:
  34. Toast.makeText(getBaseContext(),
  35. "Leftarrowwasclicked",
  36. Toast.LENGTH_LONG).show();
  37. break;
  38. caseKeyEvent.KEYCODE_DPAD_RIGHT:
  39. Toast.makeText(getBaseContext(),
  40. "Rightarrowwasclicked",
  41. Toast.LENGTH_LONG).show();
  42. break;
  43. caseKeyEvent.KEYCODE_DPAD_UP:
  44. Toast.makeText(getBaseContext(),
  45. "Uparrowwasclicked",
  46. Toast.LENGTH_LONG).show();
  47. break;
  48. caseKeyEvent.KEYCODE_DPAD_DOWN:
  49. Toast.makeText(getBaseContext(),
  50. "Downarrowwasclicked",
  51. Toast.LENGTH_LONG).show();
  52. break;
  53. }
  54. returnfalse;
  55. }
  56. }
如果你点击了OK按钮或Cancel按钮,对应的消息就会出现在屏幕上,这也就说明了,适当的事件被出发了。



除了定义一个匿名类,也可以定一个匿名内部类去处理事件。下面的例子展示如何处理EditText的onFocusChange()方法。

[java] view plain copy
  1. //---createananonymousinnerclasstoactasanonfocuslistener---
  2. EditTexttxt1=(EditText)findViewById(R.id.txt1);
  3. txt1.setOnFocusChangeListener(newView.OnFocusChangeListener()
  4. {
  5. @Override
  6. publicvoidonFocusChange(Viewv,booleanhasFocus){
  7. Toast.makeText(getBaseContext(),
  8. ((EditText)v).getId()+"hasfocus-"+hasFocus,
  9. Toast.LENGTH_LONG).show();
  10. }
  11. });
当EditText获取焦点,屏幕上就会打印出一行消息。

也可以使用匿名内部类,为两个Button设置监听。

[java] view plain copy
  1. //---thetwobuttonsarewiredtothesameeventhandler---
  2. Buttonbtn1=(Button)findViewById(R.id.btn1);
  3. //btn1.setOnClickListener(btnListener);
  4. btn1.setOnClickListener(newView.OnClickListener(){
  5. publicvoidonClick(Viewv){
  6. //---dosomething---
  7. }
  8. });
  9. Buttonbtn2=(Button)findViewById(R.id.btn2);
  10. //btn2.setOnClickListener(btnListener);
  11. btn2.setOnClickListener(newView.OnClickListener(){
  12. publicvoidonClick(Viewv){
  13. //---dosomething---
  14. }
  15. });

那么,到底该使用哪种方法去为视图设置监听呢?当你需要使用一个监听器去为多个视图服务的时候,匿名类就很有用处了。如果你只需要为单一的视图设置监听,那么就使用匿名内部类吧。

更多相关文章

  1. Android(安卓)游戏开发中 OnTouchEvent() 触屏事件的性能优化
  2. 安卓seekBar的使用(初学者)
  3. Android触摸事件(三)-触摸事件类使用实例
  4. LayoutInflater那些事儿
  5. Android(安卓)左侧抽屉 +点击事件
  6. Android(安卓)Material Design Library系列教程(三)
  7. [置顶] Android(安卓)ListView 基础入门 简介以及深入优化
  8. 【android studio】解决layout预览出现Rendering Problems Excep
  9. Android:解决TextView设置textIsSelectable=true后,第一次点击无

随机推荐

  1. 线性布局和相对布局的知识点
  2. android 设置Button或者ImageButton的背
  3. Android-XmlPullParser解析XML
  4. Android(安卓)TextView内容过长加省略号,
  5. How to decompile .dex file on Android
  6. 如何将library项目打包成jar文件
  7. arcgis for android常见问题回答
  8. Android(安卓)UI设计--半透明效果对话框
  9. ImageView.setScaleType(ImageView.ScaleT
  10. android 一直在最前面的浮动窗口效果