键侦听器不适用于布局

时间:2014-02-06 06:23:54

标签: android actionlistener keylistener onkeydown

我想将onkeylistener添加到我的线性布局中,但它不起作用,这是我的代码。 提前谢谢。

 innerlayout.setOnKeyListener(new OnKeyListener() {

                @Override
                public boolean onKey(View v, int arg1, KeyEvent e) {
                    // TODO Auto-generated method stub
                    if(e.getKeyCode()==KeyEvent.ACTION_DOWN){

                        Toast.makeText(HomeScreen.this, "down key is working", Toast.LENGTH_LONG).show();
                        innerlayout.setFocusable(true);
                    }
                    return true;
                }
            });

}

4 个答案:

答案 0 :(得分:2)

触摸事件从子节点传递到父节点。如果任何一个孩子消耗偶数(返回true),那么它就会停止;它没有传递给父母。你确定它没有在其他地方消费吗? 检查一下,对于一个动作为true,对于其余动作为false;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
        //Toast here
            return true;
        }
        **return false;**
    }  

另外,发现:
OnKeyListener or OnKeydown not work if children views take the focus
onKeyDown not being called on key press on View
这是你的情况吗?什么是布局的层次结构

答案 1 :(得分:0)

除了使用e.getKeyCode()之外,你可以直接从int arg1获取操作的整数值,也可以获得e.getAction(),并确保执行时return true ACTION_DOWN

试试如下:

          @Override
            public boolean onKey(View v, int arg1, KeyEvent e) {
                // TODO Auto-generated method stub
                if(arg1==KeyEvent.ACTION_DOWN){

                    Toast.makeText(HomeScreen.this, "down key is working", Toast.LENGTH_LONG).show();
                    innerlayout.setFocusable(true);
                   return true;
                }
                return false;

<强>编辑:

只有当您使用软键盘执行某些操作时,

setOnKeyListener才会起作用。它不会捕获鼠标指针的任何事件,因为您必须尝试使用​​鼠标光标,它将始终在模拟器中返回触摸事件。

我建议您为setOnTouchListener实施LinearLayout,这将始终响应视图上的触摸事件

尝试以下工作正常。

      innerlayout.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                Toast.makeText(MainActivity.this, "down key is working",
                        Toast.LENGTH_LONG).show();
                return true;
            } else
                return false;
        }
    });

答案 2 :(得分:0)

return false;

代替

return true;

答案 3 :(得分:0)

您几乎拥有了它。您只需将其设置为可聚焦并请求聚焦:

innerlayout.setFocusableInTouchMode(true);
innerlayout.requestFocus();
innerlayout.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int arg1, KeyEvent e) {
                // TODO Auto-generated method stub
                if(e.getKeyCode()==KeyEvent.ACTION_DOWN){

                    Toast.makeText(HomeScreen.this, "down key is working", Toast.LENGTH_LONG).show();
                    innerlayout.setFocusable(true);
                }
                return true;
            }
        });

}