Android移動開發-檢測點選按鍵事件的實現
阿新 • • 發佈:2018-12-29
檢測點選按鍵事件一般不對手機上的輸入按鍵進行處理,直接由系統按照預設情況操作。當然有時為了改善使用者體驗,需要讓應用攔截按鍵事件,並進行額外處理。
要想監控按鍵事件,首先得知道每個按鍵的編碼,這樣才能根據不同的編碼值進行相應的處理。監聽器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程式執行效果介面截圖如下: