zoukankan      html  css  js  c++  java
  • android学习笔记24——事件处理

    事件处理

    android提供了两种事件处理机制:

      1.基于回调的事件处理

      2.基于监听器的事件处理(通过绑定特定事件监听器)

    注意:

    android对于基于回调的事件处理而言,主要做法就是重写android组件特定的回调方法,或者重写Activity的回调方法。

    android为绝大部分界面组件提供了事件响应的回调方法,开发者只需要重写它们即可。

    一般来说回调的事件处理可用于处理一些具有通用性的事件,基于回调的事件处理代码比较简介,但对于某些特定的事件,无法使用基于回调的事件处理,只能采用事件监听器的处理方式。

    事件监听的处理模型

    在事件监听的处理模型中,主要涉及如下三类对象:

      1.event source:事件发生的场所,通常就是各个组件,Eg:按钮...

      2.event:事件封装了界面组件上发生的特定事情——通常就是一次用户操作

      3.event listener:负责监听事件源所发生的事件,并对各种事件做出相应的响应

    android的事件处理机制是一种委派式(Delegation)事件处理方式:

      普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器);当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。

    注意:对于委派式,可以理解为分工协作的处理方式;委派式的处理方式将事件源和事件监听器分离,从而提供更好的程序模型,有利于提高程序的可维护性。

    事件处理流程图如下:

    对于事件处理,前面的学习比较中也有很多地方已经使用到,处理方式个人理解将其分为两种处理方式如下:

    第一种处理方式:

    public class MainActivity extends TabActivity
    {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            final TabHost tabHost = this.getTabHost();
     
            TabSpec tab1 = tabHost.newTabSpec("tab1").setIndicator("tab1").setContent(R.id.tab1);
            tabHost.addTab(tab1);
            // 以上代码等价于
            tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("tab2").setContent(R.id.tab2));
            tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab3").setContent(R.id.tab3));
     
            tabHost.setOnTabChangedListener(new OnTabChangeListener()
            {
                @Override
                public void onTabChanged(String tabId)
                {
                    if (tabId.equals("tab1"))
                    { // 第一个标签
                        Toast.makeText(MainActivity.this, "选择了001", 3000).show();
                    }
                    if (tabId.equals("tab2"))
                    { // 第二个标签
                        Toast.makeText(MainActivity.this, "选择了002", 3000).show();
                    }
                    if (tabId.equals("tab3"))
                    { // 第三个标签
                        Toast.makeText(MainActivity.this, "选择了003", 3000).show();
                    }
                }
            });
        }
     }
    

    第二种处理方式:

    public class IndexActivity extends Activity
    {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.index);
     
            Spinner spinner = (Spinner) this.findViewById(R.id.spcontent);
            spinner.setOnItemSelectedListener(new SpinnerSelectLintener());
     
        }
     
        private class SpinnerSelectLintener implements OnItemSelectedListener
        {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id)
            {
                String[] books = getResources().getStringArray(R.array.books);
                String value = "选择了:" + books[position];
                Toast.makeText(IndexActivity.this, value, 3000).show();
            }
     
            @Override
            public void onNothingSelected(AdapterView<?> parent)
            {
            }
        }
    

    在基于事件监听的处理模型中,事件监听器必须实现事件监听器接口,android为不同的界面组件提供了不同的监听器接口,这些接口通常已内部类的形式存在。

    所谓事件监听器,就是实现了特定接口的java类的实例,程序中实现事件监听器,通常有如下几种方式:

      1.内部类方式,将事件监听器类定义成当前类的内部类;

      2.外部类方式,将事件监听器类定义成一个外部类;

      3.Activity本身作为事件监听器类,让Activity本身实现监听器接口,并实现事件处理方法

      4.匿名内部类形式,使用匿名内部类创建事件监听器对象。

    回调机制与监听机制

      如果说监听机制是一种委派式的处理机制,那么回调机制则恰好相反:对于基于回调机制模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。

    当用户在GUI组件上激发某个事件时,组件自己特定的方法将负责处理该事件。

      为了使用回调机制类处理GUI组件上所发生的事情,我们需要为该组件提供对应的事件处理方法——java又是一种静态语音,我们无法为某个对象动态地添加方法,因此只能继承GUI组件类,并重写该类的事件处理方法来实现。

      为了实现回调机制的事件处理机制,android为所有GUI组件提供了一些事件处理方法....

    总结:对于基于监听的事件处理模型来说,事件源和事件监听器是分离的,当事件源上发生特定事件之后,该事件交给事件监听器负责处理;

         对于基于回调事件处理模型来说,事件源和事件监听器是统一的,当事件源发生特定事件后,该事件还是由事件源本身负责处理。

    Configuration类简介

    Configuration类专门用于描述手机设备上的配置信息,这些配置信息既包括用户特定的配置项,也包括系统的动态设备配置。

    程序可调用Activity的如下方法来获取系统的Configuration对象:

      Configuration cfg = getResources().getConfiguration();

    Configuration对象提供了如下常用属性来获取系统的配置信息:

    public float fontScale 获取当前用户设置的字体的缩放因子
    public int keyboard

    获取当前设备所关联的键盘类型。该属性可能返回如下值:KEYBOARD_NOKEYS、KEYBOARD_QWERTY(普通电脑键盘)、

    KEYBOARD_12KEY(只有12个键的小键盘)

    public int keyboardHidden

    该属性返回一个boolean值用于标识当前键盘是否可用。该属性不仅会判断系统的硬件键盘,也会判断系统的软键盘(位于屏幕上)。如果

    该系统的应键盘不可用,但软键盘可用,该属性也会返回KEYBOARDHIDDEN_NO;只有两个键盘都不可用时才返回KEYBOARDHIDDEN_YES.

    public Locale locale 获取用户当前的Locale
    public int mcc 获取移动信号的国家码
    public int mnc 获取移动信号的网络码
    public int navigation 判断系统上方向导航设备的类型,该属性可能返回:NAVIGATION_NONAN(无导航)、NAVAGATION_DPAD(DPAD导航)、
    NAVIGATION_TRACKBALL(球轨迹导航)、NAVIGATION_WHEEL(滚轮导航)...
    public int orientation   获取系统屏幕的方向,该属性可能返回类型:ORIENTATION_LANDSCAPE(横向屏幕)、ORIENTATION_PORTRALT(竖向屏幕)、
    ORIENTATION_SQUARE(方形屏幕)...
    public int touchscreen

    获取系统触摸屏的触摸方式,该属性可能的返回类型:TOUCHSCREEN_NOTOUCH(无触摸)、TOUCHSCREEN_STYLUS(触摸笔式的触摸屏幕)、

    TOUCHSCREEN_FINGER(接受手指的触摸屏)

    ......

    重写onConfigurationChanged响应系统设置更改

    注意:

    如果程序需要监听系统设置的更改,则可以考虑重写Activity的onConfigurationChanged(Configuration newConfig)方法,该方法是一个基于回调的事件处理方法——当系统设置发生

    更改时,该方法会被自动触发。

    为了在程序中动态更改系统设置,可调用Activity的setRequestedOrientation(int)方法来修改屏幕的方向(在进行系统操作时,需要对AndroidMainfest.xml添加对应的操作权限配置)。

    Eg:

    Handler消息传递机制

  • 相关阅读:
    socket通信原理
    socket通信基础内容
    内核中断过程
    爬虫基础模块
    关于多个运算符的问题
    前戏
    js扩展
    加密
    django之form
    Django
  • 原文地址:https://www.cnblogs.com/YYkun/p/5795164.html
Copyright © 2011-2022 走看看