dispatchKeyEventの挙動

閲覧: 888 回
最初の未読メッセージにスキップ

morishima

未読、
2010/03/18 3:13:562010/03/18
To: 日本Androidの会
もりしまと申します。

dispatchKeyEventで戻るボタンイベントを取得し、処理を行いたいのですが、問題にあたってしまいました。

現象は以下のとおりです。
1.MainActivityからMyPreferenceActivityに移動する。
2.MyPreferenceActivityから、戻るボタンを押してMainActivityに戻る
2で戻ってきたとき、MainActivityに記述したdispatchKeyEventが呼ばれて、処理が行われてしまう。


MainActivity(一部コード)
public void onClick(View v){
startActivity(new Intent(this, MyPreferenceActivity.class));
}
@Override
public boolean dispatchKeyEvent(KeyEvent e){
if(e.getKeyCode() == KeyEvent.KEYCODE_BACK){

/* 処理 */

return true;
}
return super.dispatchKeyEvent(e);
}

MyPreferenceActivity(全コード)
public class MyPreferenceActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}

他のActivity(Activityを継承しているクラス)へ遷移した場合は、
戻るボタンでMainActivityに戻ってきてもdispatchKeyEventの処理は実行されません。
コードの問題点や解決策をご存知の方、いらっしゃいましたらご教授のほどよろしくお願いします。

moriko

未読、
2010/03/24 22:59:422010/03/24
To: 日本Androidの会
自己レスです。

dispatchKeyEventがKeyEvent.ACTION_DOWNとKeyEvent.ACTION_UPの両方に反応していたことが原因でした。

@Override
public boolean dispatchKeyEvent(KeyEvent e){
    if(e.getKeyCode() == KeyEvent.KEYCODE_BACK){
        if(e.getAction() == KeyEvent.ACTION_DOWN){
            /* 処理 */
        }
        return true;
    }
    return super.dispatchKeyEvent(e);
}

とすることで、望みの動作をさせることができました。

Activityを継承したクラスからの戻る操作では問題が起きないというのは間違いでした。
ボタンを押している時間の長さによって、MainActivityがイベントを受け取るか前のActivityで受け取られるかが違うためにそう見えたのだろうと予測しています。
以上。

2010年3月18日16:13 morishima <morish...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


全員に返信
投稿者に返信
転送
新着メール 0 件