zoukankan      html  css  js  c++  java
  • Android 处理UI事件

    一、概述

      在Java和android中,通过事件来与各种输入设备进行沟通。

      事件是由OS产生的消息,当某个UI元素被用户以特定方式进行操作时,OS就会将事件消息发送给相应的View对象。

    二、监听及事件处理

      “处理”(Handle)与“处理程序”(Handler)

    三、View类处理UI事件

      在应用程序中,每一个UI元素都是彼此不同的实例化View对象,每一个对象都包含专属于该View对象的事件。

      在布局中,一个View对象是通过公共的回调(Callback)方法来与应用程序的其它部分进行沟通的,当某一个特定动作发生在该UI的View对象中时,Android就会调用指定的回调方法。

      在Android中提供了一套事件处理接口。在View类中嵌套了这些事件接口,通过它们可以定义回调方法。因为,它们是OS的一部分,组成了View类及其所有的方法。在View类中嵌套的接口就是事件监听器。

      1. 事件回调方法:

      事件监听器就是View类中的一个Java接口,里面包含了一个单独的回调方法。以下就是在Android中常用的回调方法:

    • onClick():来自View.OnClickListener类,在触摸屏幕或者点击UI元素时触发。
    • onLongClick():来自View.OnLongCliclListener类,触摸或按钮某个UI元素超过1秒触发。
    • onKey():来自View.OnKeyListener类,按下或释放键盘时触发。
    • onTouch():来自View.OnTouchListener类,在触摸、释放、手势事件时触发。
    • onFocusChange():来自View.OnFocusChange类,在焦点改变时触发。
    • onContextMenu():来自View.OnTouchListener类,上下文菜单。

    四、事件绑定 

    1. 为指定的UI元素添加onClick(...)事件监听器

     1 public class MainActivity extends Activity
     2 {
     3     private Context mContext;
     4 
     5     @Override
     6     public void onCreate(Bundle savedInstanceState)
     7     {
     8         super.onCreate(savedInstanceState);
     9         setContentView(R.layout.activity_main);
    10 
    11         mContext = getApplicationContext();
    12 
    13         // 获取Button对象,绑定事件监听器
    14         Button syncBtn = (Button)findViewById(R.id.main_sync_btn1);
    15         // 将Button控件与事件监听器进行绑定
    16         syncBtn.setOnClickListener(new View.OnClickListener()
    17         {
    18             @Override
    19             public void onClick(View v)
    20             {
    21                 // 选择触发监听器事件的UI元素View
    22                 switch (v.getId())
    23                 {
    24                     case R.id.main_sync_btn1:
    25                     {
    26                         EditText editText = (EditText)findViewById(R.id.main_input_text1);
    27                         TextView showText = (TextView)findViewById(R.id.main_input_text2);
    28                         showText.setText(editText.getText());
    29                         break;
    30                     }
    31                     default:
    32                         Toast.makeText(mContext, mContext.getResources().getString(R.string.disable_event), Toast.LENGTH_SHORT).show();
    33                         break;
    34                 }
    35             }
    36         });
    37     }
    38 
    39 }

     

    2. 向活动添加onClick(...)监听器

     1 /**
     2  * @Classname MainActivity
     3  * @abstract 继承Activity类
     4  * @description 此类用于测试向活动添加onClick监听器,继承接口View.OnClickListener类
     5  * @throws
     6  */
     7 public class MainActivity extends Activity implements View.OnClickListener
     8 {
     9     private Context mContext;
    10 
    11     @Override
    12     public void onCreate(Bundle savedInstanceState)
    13     {
    14         super.onCreate(savedInstanceState);
    15         setContentView(R.layout.activity_main);
    16 
    17         mContext = getApplicationContext();
    18 
    19         // 获取Button对象,绑定事件监听器
    20         Button syncBtn = (Button)findViewById(R.id.main_sync_btn1);
    21         // 将Button控件与事件监听器进行绑定
    22         syncBtn.setOnClickListener(this);
    23     }
    24 
    25     // 覆盖View.OnClickListener接口类的onClick(...)方法
    26     @Override
    27     public void onClick(View view)
    28     {
    29         // 选择触发监听器事件的UI元素View
    30         switch (view.getId())
    31         {
    32             case R.id.main_sync_btn1:
    33             {
    34                 EditText editText = (EditText)findViewById(R.id.main_input_text1);
    35                 TextView showText = (TextView)findViewById(R.id.main_input_text2);
    36                 showText.setText(editText.getText());
    37                 break;
    38             }
    39             default:
    40                 Toast.makeText(mContext, mContext.getResources().getString(R.string.disable_event), Toast.LENGTH_SHORT).show();
    41                 break;
    42         }
    43     }
    44 
    45 }

      PS:注意,在继承View.OnClickListener接口类,要覆盖onClick(...)方法。同时,还要对触发事件的控件(Button)进行事件监听器绑定。

    1 // 获取Button对象,绑定事件监听器
    2 Button syncBtn = (Button)findViewById(R.id.main_sync_btn1);
    3 // 将Button控件与事件监听器进行绑定
    4 syncBtn.setOnClickListener(this);

     五、事件焦点

      当使用listView时,在view中添加button等控件,子控件会抢夺父控件的事件焦点,在父控件使用descendantFocusability属性设置其子控件不抢夺父控件事件焦点。

      属性的值有三种:

            beforeDescendants:viewgroup会优先其子类控件而获取到焦点

            afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

            blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

  • 相关阅读:
    菖蒲河公园-中山公园-天安门广场一日游
    LeetCode 485 Max Consecutive Ones
    LeetCode 766. Toeplitz Matrix
    LeetCode 566 Reshape the Matrix
    LeetCode 561. Array Partition I
    算法学习系列之(1):常用算法设计方法
    纪念2017,展望2018
    Java server数据之(4):Redis鸟瞰
    《机器学习》读书笔记-第一章 引言
    node.js实践第二天
  • 原文地址:https://www.cnblogs.com/naray/p/5355533.html
Copyright © 2011-2022 走看看