戻るキー(Backキー)を無効にする


今回は特定のキーを無効にする方法を説明します。

実際のアプリケーション開発においては、「戻る(Back)キーを無効にしたい」という場面が出てくると思います。

Androidの標準の動きとしては戻るキーを押すと現在のActivityが終了します。

しかし、戻るキーを押された時にすぐにActivityを終了させずにデータ保存の有無に関する確認ダイアログを出したい場面や、ゲームであればゲーム中に誤ってキーを押してゲームが中断することを防ぐために完全にハードウェアキーを無効にした方がよいこともあります。

以前、キーイベントを取得するで紹介したサンプルコードを少し修正するだけで実現可能です。
それでは続きでサンプルコードを説明します。

dispatchKeyEvent

Activity#dispatchKeyEvent()でイベントのハンドリングを行います。
まずはキーイベントを取得するのサンプルコードを再度掲載します。

@Override
public boolean dispatchKeyEvent(KeyEvent e) {
    // キーコード表示
    tv01.setText("KeyCode:"+e.getKeyCode());

    // 戻るボタンが押されたとき
    if(e.getKeyCode() == KeyEvent.KEYCODE_BACK) {
        // ボタンが押されたとき
        if (e.getAction() == KeyEvent.ACTION_DOWN) {
            tv01.setBackgroundColor(Color.RED); // TextViewの背景色をREDにする
        }
        // ボタンが離されたとき
        else if (e.getAction() == KeyEvent.ACTION_UP) {
            tv01.setBackgroundColor(Color.BLUE); // TextViewの背景色をBLUEにする
        }
    }
    return super.dispatchKeyEvent(e);
}

このコードでは戻るキーを押してTextViewの背景色を変更していますが、Androidのデフォルトの処理も走るのでActivityが終了してしまいます。

次に戻るキーを無効にするサンプルコードを示します。

Activityを終了せずに何もしないようにするには親クラスのdispatchKeyEvent()を呼び出さずにtrueを返すようにします。

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getAction()==KeyEvent.ACTION_DOWN) {
    	switch (event.getKeyCode()) {
    	case KeyEvent.KEYCODE_BACK:
    		// ダイアログ表示など特定の処理を行いたい場合はここに記述
    		// 親クラスのdispatchKeyEvent()を呼び出さずにtrueを返す
    		return true;
    	}
    }
    return super.dispatchKeyEvent(event);
}

これで戻るキー(Backキー)を押してもActivityが終了しないようになります。

※Androidのデフォルトの動作とは異なることになるので実際にこのように無効にするかどうかの判断は、しっかりと検討してから行うべきです。ユーザーとしてはアプリによってボタンの挙動が変わることはあまり好ましくありません。

※ホームボタンをdispatchKeyEventでフックすることはできません。

2 Comments