【问题标题】:How to send key event to an edit text如何将关键事件发送到编辑文本
【发布时间】:2011-06-14 07:41:48
【问题描述】:

例如,向编辑文本控件发送退格键以删除字符或发送 112 之类的字符代码以编程方式在编辑文本控件中附加字符。

其实我需要这样的方法

void onKeyReceived(int keyCode)
{
  // here I would like to append the keyCode to EditText, I know how to add a visible character, but what about some special keys, like arrow key, backspace key.
}

【问题讨论】:

    标签: java android android-edittext


    【解决方案1】:

    要将模拟的退格按键发送到 EditText,您必须同时发送按键和释放事件。像这样:

    mEditText.dispatchKeyEvent(new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
        KeyEvent.KEYCODE_DEL, 0));
    mEditText.dispatchKeyEvent(new KeyEvent(0, 0, KeyEvent.ACTION_UP,
        KeyEvent.KEYCODE_DEL, 0));
    

    这可用于发送任何其他密钥代码,而不仅仅是删除。

    【讨论】:

    • 如何发送Ctrl+键,例如Ctrl+Z?
    • "Ctrl+Z" 不是键,而是组合键。您可以通过以正确的顺序发送使用实际键盘时产生的事件来模拟它:ACTION_DOWN 用于 Ctrl,ACTION_DOWN 用于 Z,ACTION_UP 用于 Z,ACTION_UP 用于 Ctrl(尽管我认为 ACTION_UP 事件的顺序并不重要)。
    • 请注意,如果您想产生由 Shell 在检测到组合键“Ctrl+Z”(SIGTSTP)时发送的事件,那么可能有比模拟按键更好的选择.但这是一个完全不同的问题主题。
    • 谢谢,我已经就该主题提出了一个新问题:Calling the builtin Undo functionality of EditText by sending Ctrl+Z
    【解决方案2】:

    您的问题不是很清楚,但我认为您想在按下某些按钮时修改/附加文本到TextView。如果是这样,您需要一些现有答案的组合。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        (TextView) textView = (TextView) findViewById(R.id.myTextView);
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        switch(keyCode) {
        case KeyEvent.KEYCODE_BACK:
            // user pressed the "BACK" key.  Append "_back" to the text
            textView.append("_back");
            return true;
        case KeyEvent.KEYCODE_DEL:
            // user pressed the "BACKSPACE" key.  Append "_del" to the text
            textView.append("_del");
            return true;
        default:
            return super.onKeyDown(keyCode, event);
        }
    }
    

    是为您处理的每个案例返回true(如上所述)还是在您的switch 语句之后始终返回super.onKeyDown(keyCode, event); 将取决于您的具体要求。检查文档以了解 onKeyDown 的行为

    如果您不想在每种情况下附加文本,而是要删除一个字符或移动光标,您可以在每个case 语句中执行此操作。查看TextView documentation 了解您可以调用的不同方法。另请查看 KeyEvent documentation 以获取您可以检查的密钥列表。

    【讨论】:

      【解决方案3】:

      我认为你需要使用addTextChangedListenerEditText
      参考EditText input with pattern androidLive editing of users input的答案

      【讨论】:

        【解决方案4】:

        virsir ,我想您正在寻找以编程方式调度硬键。

        为此,您可以尝试dispatch (KeyEvent.Callback receiver, KeyEvent.DispatcherState state, Object target),并以Back and other hard keys: three stories 为例

        希望对您有所帮助。

        【讨论】:

          【解决方案5】:

          检查活动中的关键事件。例如,此代码侦听back keypress:

          @Override
          public boolean onKeyDown(int keyCode, KeyEvent event)
          {
              if ((keyCode == KeyEvent.KEYCODE_BACK))
              {
              finish();
              }
              return super.onKeyDown(keyCode, event);
          }
          

          【讨论】:

            【解决方案6】:

            只需使用 setText 方法即可。如果你想模拟退格,你可以这样做。

            String curText = mEditText.getText();
            if(!curText.equals("")){
                mEditText.setText(curText.subString(0, curText.length - 1));
            }
            

            【讨论】:

              【解决方案7】:

              模拟退格键,只需要广告代码

              editText.setText(editText.getText().substring(0,editText.getText().length()-1))
              getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
              

              模拟加一个字符,放代码

              editText.setText(editText.getText() + (char) charCode)
              

              getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

              【讨论】:

              • 只删除字符串末尾的文本。如果光标在字符串中间怎么办?
              【解决方案8】:

              看看这篇文章:creating-input-method.html。基本上,您可以手动发送KeyEvents,也可以在应用程序的Input View 中手动发送edit and commit text around the cursor。这些都是通过您的IME 的InputConnection 完成的。

              希望对你有帮助,

              【讨论】:

                【解决方案9】:

                如果你想要一个点击监听器,最好的方法是:

                View textfield = findViewById(R.id.textfield);  
                textfield .setOnClickListener(new View.OnClickListener() { 
                public void onClick(View v) {  
                /*your code for the click event here*/ }});
                

                如果您想要退格按钮,请执行以下操作:

                public void backSpace() {   
                EditText textfield = (EditText)findViewById(R.id.textfield);  
                    try {  
                        textfield.getText().delete(textfield.getSelectionEnd() - 1, textfield.getSelectionStart());  
                    } catch (Exception e) {  
                        try {  
                            textfield.getText().delete(textfield.length() - 1, textfield.length());  
                        } catch (Exception myException) {  
                        //textfield.getText().delete(textfield.length(), textfield.length() - 1);  
                        }  
                    }  
                }
                

                如果您想在 EditText 中附加一个字符,请执行以下操作:

                EditText textfield = (EditText)findViewById(R.id.textfield);  
                textfield.setText(textfield.getText().concat("112"));
                

                【讨论】:

                • 这行不通。光标可以在编辑文本中的任何位置,这只会从文本末尾删除字符。 OP希望向编辑文本发送“虚拟按键”。
                • 这不会将它们从文本的末尾删除,这会将它们从选择的开头删除到选择的结尾,如果没有选择,它将从任何内容中删除字符在光标之后。
                【解决方案10】:

                尝试实现 TextWatcher 接口。

                它有 3 个你需要重写的方法。

                public void afterTextChanged(Editable s) {
                
                    Log.v("afterTextChanged","here");
                }
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                
                    Log.v("beforeTextChanged","here");
                }
                
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }
                

                我认为这会奏效。

                【讨论】:

                • 我不想监控编辑文本的变化,但我想在编辑控件中设置一些字符,特别是对于一些特殊键,如'退格'
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-12-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多