97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

  您的位置:華清遠見教育科技集團 >> 新聞動態(tài) >> Android資料 >> Android按鍵事件處理過程詳解  
 
Android按鍵事件處理過程詳解
分享到:

在Android系統(tǒng)中,存在多種界面事件,如點擊事件、觸摸事件、焦點事件和菜單事件等,在這些界面事件發(fā)生時,Android界面框架調(diào)用界面控件的事件處理方法對事件進行處理。

Android系統(tǒng)界面事件的傳遞和處理遵循以下規(guī)則。

·如果界面控件設(shè)置了事件監(jiān)聽器,則事件將先傳遞給事件監(jiān)聽器。

·如果界面控件沒有設(shè)置事件監(jiān)聽器,界面事件則會直接傳遞給界面控件的其他事件處理方法。

·即使界面控件設(shè)置了事件監(jiān)聽器,界面事件也可以再次傳遞給其他事件處理方法。

·是否繼續(xù)傳遞事件給其他處理方法是由事件監(jiān)聽器處理方法的返回值決定的。

·如果監(jiān)聽器處理方法的返回值為true,表示該事件已經(jīng)完成處理過程,不需要其他處理方法參與處理過程,這樣事件就不會再繼續(xù)進行傳遞。

·如果監(jiān)聽器處理方法的返回值為false,則表示該事件沒有完成處理過程,或需要其他處理方法捕獲到該事件,事件會被傳遞給其他的事件處理方法。

在MVC模型中,控制器根據(jù)界面事件(UI Event)類型不同,將事件傳遞給界面控件不同的事件處理方法。

·按鍵事件(KeyEvent)將傳遞給onKey()方法進行處理。

·觸摸事件(TouchEvent)將傳遞給onTouch()方法進行處理。

下面以EditText控件中的按鍵事件為例,說明Android系統(tǒng)界面事件傳遞和處理過程。

假設(shè)EditText控件已經(jīng)設(shè)置了按鍵事件監(jiān)聽器,當(dāng)用戶按下鍵盤上的某個按鍵時,控制器將產(chǎn)生KeyEvent按鍵事件。Android系統(tǒng)會首先判斷EditText控件是否設(shè)置了按鍵事件監(jiān)聽器,因為EditText控件已經(jīng)設(shè)置按鍵事件監(jiān)聽器OnKeyListener,所以按鍵事件先傳遞到監(jiān)聽器的事件處理方法onKey()中,事件能夠繼續(xù)傳遞給EditText控件的其他事件處理方法,完全根據(jù)onKey()方法的返回值來確定:如果onKey()方法返回false,事件將繼續(xù)傳遞,這樣EditText控件就可以捕獲到該事件,將按鍵的內(nèi)容顯示在EditText控件中;如果onKey()方法返回true,將阻止按鍵事件的繼續(xù)傳遞,這樣EditText控件就不能夠捕獲到按鍵事件,也就不能夠?qū)存I內(nèi)容顯示在EditText控件中。

Android界面框架支持對按鍵事件的監(jiān)聽,并能夠?qū)存I事件的詳細信息傳遞給處理方法。為了處理控件的按鍵事件,先需要設(shè)置按鍵事件的監(jiān)聽器,并重載onKey()方法,示例代碼如代碼清單1所示。

代碼清單1 設(shè)置按鍵事件的監(jiān)聽器,并重載onKey()方法

entryText.setOnKeyListener(new OnKeyListener(){
    @Override
    public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
        //過程代碼……
        return true/false;
    }

第1行代碼是設(shè)置控件的按鍵事件監(jiān)聽器。

第3行代碼的onKey ()方法中的參數(shù):第1個參數(shù)View表示產(chǎn)生按鍵事件的界面控件;第2個參數(shù)keyCode表示按鍵代碼;第3個參數(shù)KeyEvent則包含了事件的詳細信息,如按鍵的重復(fù)次數(shù)、硬件編碼和按鍵標(biāo)志等。

第5行代碼是onKey()方法的返回值:返回true,阻止事件傳遞;返回false,允許繼續(xù)傳遞按鍵事件。

KeyEventDemo是一個說明如何處理按鍵事件的示例。

KeyEventDemo用戶界面如圖1所示。


圖1 KeyEventDemo用戶界面

從圖5-27中可以看出,上方的EditText控件是輸入字符的區(qū)域,中間的CheckBox控件用來控制onKey()方法的返回值,下方的TextView控件用來顯示按鍵事件的詳細信息,包括按鍵動作、按鍵代碼、按鍵字符、UNICODE編碼、重復(fù)次數(shù)、功能鍵狀態(tài)、硬件編碼和按鍵標(biāo)志。

界面的XML文件的代碼如代碼清單2所示

代碼清單2 界面XML文件

<EditText android:id="@+id/entry"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </EditText>
    <CheckBox android:id="@+id/block"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="返回true,阻止將按鍵事件傳遞給界面元素" >
    </CheckBox>
    <TextView android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鍵事件信息" >
    </TextView>

在EditText中,當(dāng)任何一個鍵按下或抬起時,都會引發(fā)按鍵事件。為了能夠使EditText處理按鍵事件,需要使用setOnKeyListener ()方法在代碼中設(shè)置按鍵事件監(jiān)聽器,并在onKey()方法中添加按鍵事件的處理過程,代碼如代碼清單3所示。

代碼清單3 setOnKeyListener()

entryText.setOnKeyListener(new OnKeyListener(){
        @Override
        public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
            int metaState = keyEvent.getMetaState();
            int unicodeChar = keyEvent.getUnicodeChar();
            String msg = "";
            msg +="按鍵動作:" + String.valueOf(keyEvent.getAction())+"\n";
            msg +="按鍵代碼:" + String.valueOf(keyCode)+"\n";
            msg +="按鍵字符:" + (char)unicodeChar+"\n";
            msg +="UNICODE:" + String.valueOf(unicodeChar)+"\n";
            msg +="重復(fù)次數(shù):"+ String.valueOf(keyEvent.getRepeatCount())+"\n";
            msg +="功能鍵狀態(tài):" + String.valueOf(metaState)+"\n";
            msg +="硬件編碼:" + String.valueOf(keyEvent.getScanCode())+"\n";
            msg +="按鍵標(biāo)志:" + String.valueOf(keyEvent.getFlags())+"\n";
            labelView.setText(msg);
            if (checkBox.isChecked())
            return true;
            else
            return false;
        }

在上述代碼中,第4行代碼用來獲取功能鍵狀態(tài)。功能鍵包括左Alt鍵、右Alt鍵和Shift鍵,當(dāng)這3個功能鍵被按下時,功能鍵代碼metaState值分別為18、34和65;但沒有功能鍵被按下時,功能鍵代碼metaState值分別為0。

第5行代碼獲取了按鍵的Unicode值,而在第9行中,將Unicode轉(zhuǎn)換為了字符,顯示在TextView中。

第7行代碼獲取了按鍵動作,0表示按下按鍵,1表示抬起按鍵。第7行代碼獲取按鍵的重復(fù)次數(shù),但當(dāng)按鍵被長時間按下時,則會產(chǎn)生這個屬性值。

第13行代碼獲取了按鍵的硬件編碼,各硬件設(shè)備的按鍵硬件編碼都不相同,因此該值一般用于調(diào)試。

第14行獲取了按鍵事件的標(biāo)志符。

 更多相關(guān)文章

·Android系統(tǒng)菜單之快捷菜單
·Android系統(tǒng)菜單之子菜單
·Android系統(tǒng)菜單之選項菜單
·Android系統(tǒng)控件TabHost
·Android系統(tǒng)控件ListView