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消息传递机制

原文地址:https://www.cnblogs.com/YYkun/p/5795164.html