【问题标题】:Android Development: How To Use onKeyUp?Android开发:如何使用onKeyUp?
【发布时间】:2011-04-14 01:24:18
【问题描述】:

我是 Android 开发新手,似乎找不到关于如何使用 onKeyUp 监听器的好指南。

在我的应用程序中,我有一个很大的EditText,当有人按下并释放该EditText 中的一个键时,我想调用一个函数,该函数将在该EditText 中执行正则表达式。

我不知道如何使用 onKeyUp。有人可以告诉我怎么做吗?

【问题讨论】:

    标签: java android onkeyup


    【解决方案1】:

    非常正确的方法是使用 TextWatcher 类。

    EditText tv_filter = (EditText) findViewById(R.id.filter);
    
    TextWatcher fieldValidatorTextWatcher = new TextWatcher() {
            @Override
            public void afterTextChanged(Editable s) {
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (filterLongEnough()) {
                    populateList();
                }
            }
    
            private boolean filterLongEnough() {
                return tv_filter.getText().toString().trim().length() > 2;
            }
        };
        tv_filter.addTextChangedListener(fieldValidatorTextWatcher);
    

    【讨论】:

    • 谢谢,我很久以前就接触过 TextWatcher 类了。一定是忘记标记正确答案了,抱歉浪费您的时间!
    【解决方案2】:

    更正:

    有一段时间,我使用了一个通用的 onKeyListener。我很快发现我的代码被调用了两次。一次是向下键,一次是向上键。我现在使用下面的监听器并且只调用一次代码。 "if (event.getAction() == KeyEvent.ACTION_UP)" 是关键。

    OnKeyListener keyListener = new OnKeyListener() {
    
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
                //do something here
            }
            return false;
        }
    };
    

    我发现 Activity 中的每个控件都会自动调用 onKeyUp()。如果这是您想要的,请将其添加到 Activity 中,就像添加 onCreate()

    例子:

    public boolean onKeyUp(int keyCode, KeyEvent event) {
        //do something here
        return false;
    };
    

    我知道这是一个老问题,但也许这会帮助其他人解决同样的问题。

    【讨论】:

      【解决方案3】:

      您可以考虑使用以下代码:

       @Override 
       public boolean onKeyUp(int keyCode, KeyEvent event) {
          switch (keyCode) {
              ...
              case KeyEvent.KEYCODE_J:
                  if (event.isShiftPressed()) {
                      fireLaser();
                  } else {
                      fireMachineGun();
                  }
                  return true;
              case KeyEvent.KEYCODE_K:
                  if (event.isShiftPressed()) {
                      fireSeekingMissle();
                  } else {
                      fireMissile();
                  }
                  return true;
              default:
                  return super.onKeyUp(keyCode, event);
          } }
      

      这里最后我们调用了super.onkeyUp方法。当用户没有按下有效键时,它会处理事件。

      更多详情,您可以考虑关注link

      【讨论】:

        【解决方案4】:

        只为EditText。它是由setOnClickListener() 自己实现的。不需要onKeyUp()。因为这将通过单击/触摸事件执行。正确的?就这样做吧。

        edittext_object.setOnClickListener(new OnClickListener() {
             public void onClick(View v) {
            //do what you need 
            }
        }
        

        【讨论】:

        • 他可能想在onkeyup期间做点什么,
        【解决方案5】:

        这是从我的脑海中写出来的,但它应该在以下几行中:

        text.setKeyListener(new KeyListener() {
            @Override
            public boolean onKeyUp(int keyCode, KeyEvent event) {
        
        
                if(keyCode == KeyEvent.KEYCODE_0) dosomething // pick the custom key from keyEvent
        
        
                return super.onKeyUp(keyCode, event);
            }
        });
        

        【讨论】:

          【解决方案6】:

          如果您使用没有触摸但带有硬键盘按钮(键盘)的设备,请使用此代码来控制左右移动的事件并确定。使用 onkeyDown 而不是 onKeyUp 因为 onKeyup 将返回下一个按钮事件:

                  Button myButton = (Button) findViewById(R.id.my_btn);
                  myButton .setKeyListener(new KeyListener() {
                  @Override
                  public int getInputType() {
                      return 0;
                  }
          
                  @Override
                  public boolean onKeyDown(View view, Editable editable, int keyCode, KeyEvent keyEvent) {
                      Log.d("myTag", "onKeyDown code: " +keyCode);
                      switch (keyCode) {
                          case KeyEvent.KEYCODE_DPAD_RIGHT:
                              // USER_MOVE_RIGHT();
                              return true;
                          case KeyEvent.KEYCODE_DPAD_LEFT:
                              //USER_MOVE_LEFT());
                              return true;
                          case KeyEvent.KEYCODE_DPAD_DOWN:
                              //USER_MOVE_DOWN());
                              return true;
                          case KeyEvent.KEYCODE_DPAD_UP:
                              //USER_MOVE_UP();
                              return true;
                          case KeyEvent.KEYCODE_DPAD_CENTER:
                              //USER_Press_OK()
                              return true;
                                         }
                      return false;
                  }
          

          【讨论】:

            【解决方案7】:
                ‏       public boolean onKeyDown(int keyCode, KeyEvent event) {
                    switch (keyCode) {
                    ‏               case KeyEvent.KEYCODE_BACK:
                    ‏                   actionLabel.setText("KEYCODE_BACK key pressed");
                    ‏                   Toast.makeText(this, "Press again back for exit", Toast.LENGTH_SHORT).show();
                    ‏                   counter++;
                    ‏                   if (counter > 1) {
                    ‏                       super.onBackPressed();
                    ‏                   }
                    ‏                   return true;
                    ‏               case KeyEvent.KEYCODE_VOLUME_UP:
                    ‏                   actionLabel.setText("VOLUME_UP key pressed");
                    ‏                   return true;
                    ‏               case KeyEvent.KEYCODE_VOLUME_DOWN:
                    ‏                   actionLabel.setText("VOLUME_DOWN key pressed");
                    ‏                   return true;
                    ‏           }
                    return super.onKeyDown(keyCode, event);
                    ‏       }
                // catches the onKeyUp button event
                ‏       @Override
                ‏       public boolean onKeyUp(int keyCode, KeyEvent event) {
                ‏           switch (keyCode) {
                ‏               case KeyEvent.KEYCODE_BACK:
                ‏                   actionLabel.setText("KEYCODE_BACK key released");
                ‏                   return true;
                ‏               case KeyEvent.KEYCODE_VOLUME_UP:
                ‏                   actionLabel.setText("VOLUME_UP key released");
                ‏                   return true;
                ‏               case KeyEvent.KEYCODE_VOLUME_DOWN:
                ‏                   actionLabel.setText("VOLUME_DOWN key released");
                ‏                   return true;
                ‏           }
                ‏           return super.onKeyDown(keyCode, event);
                ‏       }
                // works for API level 5 and lower
                ‏       @Override
                ‏       public void onBackPressed() {
                ‏           actionLabel.setText("BACK key pressed");
                ‏           super.onBackPressed();
                ‏       }
                // catches the long press button event (longer than 2 seconds)
                ‏       @Override
                ‏       public boolean onKeyLongPress(int keyCode, KeyEvent event) {
                ‏           Toast.makeText(this, "Pressed for a long time", Toast.LENGTH_SHORT).show();
                ‏           return true;
                ‏       }
                // catches the on touch event on screen and shows the specific pixels
                ‏       // touched
                ‏       @Override
                ‏       public boolean onTouchEvent(MotionEvent event) {
                ‏           float x = event.getX();
                ‏           float y = event.getY();
                ‏           actionLabel.setText("Touch press on x: " + x + " y: " + y);
                ‏           return true;
                ‏       }}
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-11-15
              • 1970-01-01
              • 2013-10-31
              • 1970-01-01
              • 2018-07-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多