Как отправить ключевое событие для редактирования текста - PullRequest
12 голосов
/ 24 января 2011

Например, отправьте клавишу возврата на элемент управления редактирования текста, чтобы удалить символ, или отправьте код символа, например 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.
}

Ответы [ 10 ]

18 голосов
/ 06 января 2012

Чтобы отправить имитируемую клавишу возврата, нажмите на 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));

Это можно использовать для отправки любого другого кода ключа, а не просто для удаления.

7 голосов
/ 04 февраля 2011

Ваш вопрос не совсем ясен, но я думаю, что вы хотите изменить / добавить текст к 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 для каждого обработанного вами случая (как указано выше) или всегда возвращать super.onKeyDown(keyCode, event); после того, как ваше заявление switch будет зависеть от ваших точных требований. Проверьте документацию на поведение onKeyDown

Если вместо добавления текста в каждом случае вы хотите удалить символ или переместить курсор, вы можете сделать это в каждом операторе case. Посмотрите TextView документацию для различных методов, которые вы можете вызвать. Также посмотрите в KeyEvent документации список ключей, которые вы можете проверить.

2 голосов
/ 07 февраля 2011

virsir, я полагаю, вы ищете программную отправку жестких ключей.

Для этого вы можете попробовать dispatch (получатель KeyEvent.Callback, состояние KeyEvent.DispatcherState, цель объекта) пример на Назад и другие жесткие клавиши: три истории

Надеюсь, что поможет.

2 голосов
/ 03 февраля 2011

Я думаю, вам нужно использовать addTextChangedListener до EditText.
См ответ EditText ввода с шаблоном Android и Live редактирование ввода пользователей

1 голос
/ 05 февраля 2011

Взгляните на эту статью: creation-input-method.html .По сути, вы можете либо вручную отправить KeyEvents, либо вручную edit and commit text around the cursor в Input View приложения. Все это делается через IME InputConnection.

Надеюсь, это поможет,

1 голос
/ 03 февраля 2011

для имитации клавиши возврата, просто рекламный код

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

1 голос
/ 03 февраля 2011

, если вы хотите прослушивать клики, лучший способ сделать это это:

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"));
1 голос
/ 01 февраля 2011

просто используйте метод setText для этого. Если вы хотите симулировать возврат, вы можете сделать что-то вроде этого.

String curText = mEditText.getText();
if(!curText.equals("")){
    mEditText.setText(curText.subString(0, curText.length - 1));
}
1 голос
/ 24 января 2011

попробуйте реализовать интерфейс 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) {
}

Я думаю, это будет работать.

1 голос
/ 24 января 2011

Проверьте ключевые события в вашей деятельности.например, этот код прослушивает нажатие клавиши back:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if ((keyCode == KeyEvent.KEYCODE_BACK))
    {
    finish();
    }
    return super.onKeyDown(keyCode, event);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...