【问题标题】:key listener is not working for layout关键监听器不适用于布局
【发布时间】:2014-03-02 23:10:00
【问题描述】:

我想将 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;
                }
            });

}

【问题讨论】:

  • innerlayout 的 findviewbyid 可以吗?
  • 是的,如果我使用以下代码就可以了,那么它可以正常工作
  • @NumanAhmad 查看我的答案并相应尝试。
  • 我已经检查了您的答案并尝试实施,但它不起作用。如果我使用以下代码,那么它可以工作,但我想实现 keylistener innerlayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO 自动生成的方法存根 //first.getId( ); Toast.makeText(HomeScreen.this, "down key is working", Toast.LENGTH_LONG).show(); innerlayout.setFocusable(true); } }); }
  • 我认为如果您使用布局,那么 onClick/OnLongclick/onTouch 选项是可用的。 OnKeyListener 主要用于编辑文本。

标签: android actionlistener keylistener onkeydown


【解决方案1】:

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

尝试如下:

          @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 仅在您使用软键盘执行某些操作时才有效。它不会捕获鼠标指针的任何事件,因为您必须尝试使用​​鼠标光标,这将始终在模拟器中返回触摸事件。

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

试一试它的工作正常。

      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;
        }
    });

【讨论】:

  • 或 (event.getAction() == KeyEvent.ACTION_DOWN)
  • 你能展示更多你的线性布局的代码吗?你试过(e.getAction() == KeyEvent.ACTION_DOWN)
  • innerlayout.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int arg1, KeyEvent e) { // TODO 自动生成的方法存根 if(arg1 == KeyEvent.ACTION_DOWN) { Toast.makeText(HomeScreen.this, "down key is working", Toast.LENGTH_LONG).show(); innerlayout.setFocusable(true); return true; } return false; } }); }
【解决方案2】:

return false;

改为

return true;

【讨论】:

    【解决方案3】:

    因为触摸事件是从子级传递给父级的。如果有任何孩子消费了该事件(返回真),那么它就会停止;它不会传递给父级。你确定它没有在其他地方消费吗? 检查这一点,一个动作为真,其余为假,超级调用:

    @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
    这是你的情况吗?布局的层次结构是什么

    【讨论】:

    • 当我使用这一行时返回 super.onKeyDown(keyCode, e);它给出了一个错误,该方法未为类型对象定义。
    【解决方案4】:

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

    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;
                }
            });
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 2012-04-29
      相关资源
      最近更新 更多