Изменение ввода EditText на строку при нажатии определенной клавиши Android

У меня есть EditText в моем приложении. Я хочу переопределить функциональность клавиши @ таким образом, чтобы, как только пользователь нажмет клавишу @ при вводе данных в EditText, @ должен быть заменен какой-либо строкой, например «Hello world».

Я создал что-то вроде ниже, которое показывает всплывающее сообщение, когда я нажимаю клавишу @. Но я не знаю, как это реализовать при работе с EditText.

Вот мой код: -

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        // TODO Auto-generated method stub
        if(editText1.isFocused() && event.isShiftPressed() && keyCode == KeyEvent.KEYCODE_2 )
        {
            //txtSample.setText("Hello");
            Toast.makeText(this, "Hello", Toast.LENGTH_LONG).show();



        }
} 

person user2625086    schedule 11.02.2014    source источник


Ответы (3)


InputFilter - это правильный способ делать такие вещи.

Правильная рабочая демонстрация

public class MainActivity extends Activity {

    private EditText editText;
    private InputFilter filter = new InputFilter() {

        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

            if (source != null && ("" + source).equals("@")) {
                return "Hello World";
            }
            return null;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.editText);
        editText.setFilters(new InputFilter[] { filter });

    }

}
person Biraj Zalavadia    schedule 11.02.2014
comment
прекрасно работает! Благодарю. Кстати, есть идеи, можем ли мы добиться этого для полей EditText внутри WebView? - person user2625086; 11.02.2014

mMyEditText.addTextChangedListener(new TextWatcher()
{
    public void afterTextChanged(Editable s) 
    {
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after) 
    {
        /*This method is called to notify you that, within s, the count characters beginning at start are about to be replaced by new text with length after. It is an error to attempt to make changes to s from this callback.*/ 
    }
    public void onTextChanged(CharSequence s, int start, int before, int count) 
    {
    }
);

в этом коде, если onTextChanged s==@, замените его на Hello World

person Swapnil    schedule 11.02.2014
comment
Спасибо за ваш ответ. Проблема в том, что если я введу abc@ в EditText, как только я нажму клавишу @, текст должен быть добавлен после моего ввода, например [email protected] - person user2625086; 11.02.2014

Вам просто нужно добавить

String replacedText = txtSample.getText().replace("@","Hello World");
txtSample.setText(replacedText);
person V.J.    schedule 11.02.2014
comment
Спасибо за ваш ответ. Но я думаю, вы неправильно поняли вопрос. Я хочу изменить текст в EditText на что-то другое, как только пользователь нажмет определенную клавишу - person user2625086; 11.02.2014
comment
Я просто пишу код, который заменяет вашим тостом. - person V.J.; 12.02.2014