1. 程式人生 > >Android移動開發-檢測點選按鍵事件的實現

Android移動開發-檢測點選按鍵事件的實現

檢測點選按鍵事件一般不對手機上的輸入按鍵進行處理,直接由系統按照預設情況操作。當然有時為了改善使用者體驗,需要讓應用攔截按鍵事件,並進行額外處理。
要想監控按鍵事件,首先得知道每個按鍵的編碼,這樣才能根據不同的編碼值進行相應的處理。監聽器OnKeyListener只會檢測控制鍵,不會檢測文字鍵。按鍵編碼的取值說明如下表:

  • 表 按鍵編碼的取值說明
按鍵編碼 KeyEvent類的按鍵名稱 說明
3 KEYCODE_HOME 主頁鍵(未開發給普通應用)
4 KEYCODE_BACK 返回鍵(後退鍵)
24 KEYCODE_VOLUME_UP 加大音量鍵
25 KEYCODE_POWER 減小音量鍵
26 KEYCODE_POWER 電源鍵(未開發給普通應用)
66 KEYCODE_ENTER 回車鍵
67 KEYCODE_DEL 刪除鍵(退格鍵)
82 KEYCODE_MENU 選單鍵
84 KEYCODE_SEARCH 搜尋鍵
187 KEYCODE_APP_SWITCH 任務鍵(未開發給普通應用)

實際監控結果顯示,每次按控制鍵時,onKey方法都會收到兩次重複編碼的按鍵事件,這是因為該方法把每次按鍵都分成按下與鬆開的兩個動作,所以一次按鍵變成了兩個按鍵動作。

  • 檢測軟鍵盤

  • layout/activity_key_soft.xml介面佈局程式碼如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">

    <EditText
        android:id
="@+id/et_soft" android:layout_width="match_parent" android:layout_height="40dp" android:layout_margin="5dp" android:background="@drawable/editext_selector" android:hint="輸入文字進行鍵盤檢測" android:textColor="@color/black" android:textSize="16sp" />
<TextView android:id="@+id/tv_result" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="16sp" /> </LinearLayout>
  • KeySoftActivity.java邏輯程式碼如下:
package com.fukaimei.keyevent;

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;

public class KeySoftActivity extends AppCompatActivity implements OnKeyListener {
    private EditText et_soft;
    private TextView tv_result;
    private String desc = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_key_soft);
        et_soft = (EditText) findViewById(R.id.et_soft);
        tv_result = (TextView) findViewById(R.id.tv_result);
        et_soft.setOnKeyListener(this);
    }

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            desc = String.format("%s輸入的軟按鍵編碼是%d,動作是按下", desc, keyCode);
            if (keyCode == KeyEvent.KEYCODE_ENTER) {
                desc = String.format("%s, 按鍵為回車鍵", desc);
            } else if (keyCode == KeyEvent.KEYCODE_DEL) {
                desc = String.format("%s, 按鍵為刪除鍵", desc);
            } else if (keyCode == KeyEvent.KEYCODE_SEARCH) {
                desc = String.format("%s, 按鍵為搜尋鍵", desc);
            } else if (keyCode == KeyEvent.KEYCODE_BACK) {
                desc = String.format("%s, 按鍵為返回鍵", desc);
                mHandler.postDelayed(mFinish, 3000);
            } else if (keyCode == KeyEvent.KEYCODE_MENU) {
                desc = String.format("%s, 按鍵為選單鍵", desc);
            } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
                desc = String.format("%s, 按鍵為加大音量鍵", desc);
            } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
                desc = String.format("%s, 按鍵為減小音量鍵", desc);
            }
            desc = desc + "\n";
            tv_result.setText(desc);
            return true;
        } else {
            //返回true表示處理完了不再輸入該字元,返回false表示給你輸入該字元吧
            return false;
        }
    }

    private Handler mHandler = new Handler();
    private Runnable mFinish = new Runnable() {
        @Override
        public void run() {
            finish();
        }
    };

}
  • Demo程式執行效果介面截圖如下:

這裡寫圖片描述

  • 檢測物理按鍵

除了給控制元件註冊按鍵監聽器外,還可以直接在活動頁面上檢測物理按鍵,即重寫Activity的onKeyDown方法。onKeyDown方法的使用與前面的onKey方法類似,擁有按鍵編碼與按鍵事件KeyEvent兩個引數。

  • layout/activity_key_hard.xml介面佈局程式碼如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">

    <TextView
        android:id="@+id/tv_hard"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center"
        android:text="請按裝置上的物理鍵開始檢測"
        android:textColor="@color/black"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:textSize="16sp" />

</LinearLayout>
  • KeyHardActivity.java邏輯程式碼如下:
package com.fukaimei.keyevent;

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.widget.TextView;

public class KeyHardActivity extends AppCompatActivity {
    private TextView tv_result;
    private String desc = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_key_hard);
        tv_result = (TextView) findViewById(R.id.tv_result);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        desc = String.format("%s物理按鍵的編碼是%d", desc, keyCode);
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            desc = String.format("%s, 按鍵為返回鍵", desc);
            mHandler.postDelayed(mFinish, 3000);
        } else if (keyCode == KeyEvent.KEYCODE_MENU) {
            desc = String.format("%s, 按鍵為選單鍵", desc);
        } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
            desc = String.format("%s, 按鍵為加大音量鍵", desc);
        } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
            desc = String.format("%s, 按鍵為減小音量鍵", desc);
        }
        desc = desc + "\n";
        tv_result.setText(desc);
        //返回true表示不再響應系統動作,返回false表示繼續響應系統動作
        return true;
    }

    private Handler mHandler = new Handler();
    private Runnable mFinish = new Runnable() {
        @Override
        public void run() {
            finish();
        }
    };

}
  • Demo程式執行效果介面截圖如下:

這裡寫圖片描述