【问题标题】:onKey onKeyDown not workingonKey onKeyDown 不起作用
【发布时间】:2016-09-16 02:47:59
【问题描述】:

我正在尝试在我的 android 应用中注册方向键/电视遥控器 d 键点击。我目前正在使用 android 模拟器进行测试,并且正在尝试使用额外设置菜单下的方向键输入进行单击。但我不确定为什么这不起作用 - 任何帮助将不胜感激

public class FullscreenActivity extends AppCompatActivity {

    private View mContentView;
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_fullscreen);

            mContentView = findViewById(R.id.fullscreen_content);

            mContentView.setOnKeyListener(new View.OnKeyListener() {
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    Log.d("debug", "we are here");
                    if (event.getAction() == KeyEvent.ACTION_DOWN)
                        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
                            Log.d("keycode", "center pressed");
                            return true;
                        }
                    switch (keyCode) {
                        case KeyEvent.KEYCODE_DPAD_UP:
                        case KeyEvent.KEYCODE_DPAD_DOWN:
                        case KeyEvent.KEYCODE_DPAD_RIGHT:
                        case KeyEvent.KEYCODE_DPAD_LEFT:
                        case KeyEvent.KEYCODE_DPAD_CENTER:
                            Log.d("OnKey", "key pressed!");
                            return true;
                    }
                    return false;
                }
            });
        }
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            return super.onKeyDown(keyCode, event);
        }
}

运行此代码在 logcat 上没有任何输出

【问题讨论】:

  • 你的听众被叫到了吗
  • @siddhesh 我对 android 和 java 真的很陌生,所以我不确定你的意思 - 我上面的代码是我正在使用的唯一代码。我没有打印出任何内容,包括 onKey 方法中的第一行“我们在这里”
  • 在 logcat 中,你是在打印 debug", "we are here" 还是 Log.d("keycode", "center press");
  • @siddhesh nope 没有得到任何东西
  • 这是什么mContentView

标签: android


【解决方案1】:

您可以覆盖 Activity 的 onKeyDown() 方法来检测按键。

试试这个

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (event.getAction() == KeyEvent.ACTION_DOWN) {

        switch (event.getKeyCode()) {
            case  KeyEvent.KEYCODE_DPAD_UP:
                 showToast("UP pressed");
            return true;
            case  KeyEvent.KEYCODE_DPAD_DOWN:
                 showToast("DOWN pressed");
            return true;
            case  KeyEvent.KEYCODE_DPAD_RIGHT:
                 showToast("RIGHT pressed");
            return true;
            case  KeyEvent.KEYCODE_DPAD_LEFT:
                 showToast("LEFT pressed");
            return true;
            case  KeyEvent.KEYCODE_DPAD_CENTER:
                 showToast("CENTER pressed");
            return true;
           }
         }
        return super.onKeyDown(keyCode, event);
  }

  void showToast(String msg)
  {
    Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_SHORT).show();
  } 

【讨论】:

  • 所以我不需要在我的 mcontentview 中注册一个 onkeylistener 吗?你能解释一下这是为什么吗?
  • 如果你想在视图之间提供导航,如果你想在整个活动中访问按键事件,你可以使用 onKeyDown() 方法。 View.OnKeyListener 可用于仅调度到该视图的键事件。
【解决方案2】:

试试这段代码是否可行

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if(keyCode==KeyEvent.KeyEvent.KEYCODE_DPAD_CENTER)
    {
        Toast.makeText(<Activity_name>.this, "Application Quits", Toast.LENGTH_SHORT).show();
          finish();
          return false;
    }

    return super.onKeyDown(keyCode, event);
}

【讨论】:

  • 当我按下中心按钮时,我收到消息“应用程序退出” - 请您帮我理解我所做的和所做的之间有什么区别吗? onKeyDown 与 setOnKeyListener 和 OnKey 有何关系?我所有的按钮按下代码都应该放在这个方法中,还是放在 OnCreate() 中的 OnKey 方法中?
  • 一般我们使用onKeyDown函数来追踪按键事件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
相关资源
最近更新 更多