Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
SINIGR
1 / 1 / 1
Регистрация: 24.07.2011
Сообщений: 34
#1

Обработка нажатий клавиш программной клавиатуры - Android

06.12.2014, 16:34. Просмотров 2761. Ответов 16
Метки нет (Все метки)

Не знаю, была ли эта тема. Но столкнулся с такой проблемой: допустим есть макет с EditText и ListView. Они отображаются сверху вниз в порядке описания. Необходимо записать текст в EditText, а затем по нажатию клавиши, добавить этот текст в ListView, через адаптер.

Следующий код, как я уже выяснил не работает с программной клавиатурой, а только с физической:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
EditText editText = (EditText) findViewByID(R....);
editText.setOnKeyListener(new OnKeyListener()
{
        public boolean onKey(View v, int keyCode, KeyEvent event)
        {
             if (event.getAction() == KeyEvent.ACTION_DOWN)
                 if ((keyCode == KeyEvent.KEYCODE_ENTER))
                 {    // Это событие не наступает
                       String newItem = editText.getText().toString();
                       list.add(newItem);
                       adapter.notifyDataSetChanged();
                 }
        }
}
);
Каким образом можно реализовать данное поведение?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
 Аватар для YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
06.12.2014, 19:15     Обработка нажатий клавиш программной клавиатуры #2
SINIGR, Вам нужен OnEditorActionListener.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
06.12.2014, 20:39     Обработка нажатий клавиш программной клавиатуры #3
...или TextWatcher
SINIGR
1 / 1 / 1
Регистрация: 24.07.2011
Сообщений: 34
06.12.2014, 23:47  [ТС]     Обработка нажатий клавиш программной клавиатуры #4
TextWatcher здесь не подойдет, насколько я понимаю, хотя, конечно, могу быть не прав.

Добавлено через 23 минуты
По умолчанию при нажатии на кнопку "enter" в телефоне, в Edittext происходит переход на новую строку. Вообще возможно обработать событие нажатия этой кнопки, либо других, например цифр. Если да, вы могли бы привести фрагмент кода?
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
07.12.2014, 10:29     Обработка нажатий клавиш программной клавиатуры #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Предупреждаю сразу - это чисто в доказательство реализации через TextWatcher.
Даже, если это вариант удаления гланд через задницу - я не виноват.

Вводим переменную, хрянящую текст до момента нажатия.
В момент изменения смотрим на введенный символ и, если это возврат каретки, выводим ранее введенный текст.

Задача решена - есть перехват ввода 'энтер' и реакция на его ввод.
Полетит ли этот самолёт дальше - не знаю.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
EditText editText = (EditText) findViewByID(R....);
 
String cEditTextString; //Вводим переменную, хрянящую текст до момента нажатия
 
TextWatcher twTextWatcher = new TextWatcher(){
 
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                cEditTextString = s.toString(); // запоминаем предыдущее состояние
    
            }
 
            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                                //обрабатываем нажатие
                if (s.charAt(start)=='\n') 
                    Toast.makeText(getBaseContext(), "Enter is pressed. \n"+
                        "EditText text: "+cEditTextString, Toast.LENGTH_SHORT).show();          
            }
            
            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
                };
            };
            
        }; 
 
editText.addTextChangedListener(twTextWatcher);
YuraAAA
 Аватар для YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
07.12.2014, 11:36     Обработка нажатий клавиш программной клавиатуры #6
Armagedo, да уж, не сильно изящно =)
SINIGR, добавляем в разметку editText-а строку
XML
1
android:imeOptions="actionDone"
В коде:
Java
1
2
3
4
5
6
7
8
9
10
editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    //TODO
                    return true;
                }
                return false;
            }
        });
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
07.12.2014, 12:02     Обработка нажатий клавиш программной клавиатуры #7
YuraAAA, ну выковривание 'энтер' и налепливание 'дан' на программной клавиатуре тоже как-бы не особо...
На физической клавиатуре тоже так можно?
SINIGR
1 / 1 / 1
Регистрация: 24.07.2011
Сообщений: 34
07.12.2014, 12:30  [ТС]     Обработка нажатий клавиш программной клавиатуры #8
Вариант с TextWatcher по крайней мере работает, кое-как, а вот с setOnEditorActionListener у меня не ловит события, причем сделал все в том же виде, что и у вас.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
07.12.2014, 12:38     Обработка нажатий клавиш программной клавиатуры #9
Еще один
Что значит "кое-как"?
Как вы измерили эту величину и в чем отличие от реализованных вами методов, которые работают "не кое-как"?
SINIGR
1 / 1 / 1
Регистрация: 24.07.2011
Сообщений: 34
07.12.2014, 12:43  [ТС]     Обработка нажатий клавиш программной клавиатуры #10
Armagedo, вам большое спасибо за это, все работает, но просто интересно, это единственный способ, нет ли аналогичного способа как с обработкой физической клавиатуры
YuraAAA
 Аватар для YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
07.12.2014, 13:03     Обработка нажатий клавиш программной клавиатуры #11
Armagedo,
Цитата Сообщение от Armagedo Посмотреть сообщение
ну выковривание 'энтер' и налепливание 'дан' на программной клавиатуре тоже как-бы не особо...
что значит не очень, если на это рассчитан этот функционал?оО
SINIGR
1 / 1 / 1
Регистрация: 24.07.2011
Сообщений: 34
07.12.2014, 13:28  [ТС]     Обработка нажатий клавиш программной клавиатуры #12
В общем, спасибо всем, получилось сделать все как нужно!

Добавлено через 1 минуту
YuraAAA, И все таки, через setOnEditorActionListener у меня не отлавливались события, вы можете предположить с чем это связанно?
YuraAAA
 Аватар для YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
07.12.2014, 13:30     Обработка нажатий клавиш программной клавиатуры #13
SINIGR, покажите код. Как Вы проверили, что не ловится? Я такого не видел ещё =)
SINIGR
1 / 1 / 1
Регистрация: 24.07.2011
Сообщений: 34
07.12.2014, 13:47  [ТС]     Обработка нажатий клавиш программной клавиатуры #14
YuraAAA,
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class MyKeyListener extends Activity
{
    private EditText editText;
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_key_listener);
 
        editText = (EditText) findViewById(R.id.myedit);
        editText.setOnEditorActionListener(new EditText.OnEditorActionListener()
        {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
            {
                if (actionId == EditorInfo.IME_ACTION_DONE)
                {
                    Toast.makeText(MyKeyListener.this, "Enter is pressed!", Toast.LENGTH_SHORT).show();
                    return true;
                }
                return false;
            }
 
        });
 
    }
 
}
XML
1
2
3
4
5
<EditText
        android:id="@+id/myedit"
        android:imeOptions="actionDone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
На экран ничего не выводит, просто происходит переход на след. строку
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
07.12.2014, 14:59     Обработка нажатий клавиш программной клавиатуры #15
SINIGR, добавь в xml для эдитбокса аттрибут inputType

XML
1
2
3
4
5
6
<EditText
android:id="@+id/myedit"
android:inputType="text"
android:imeOptions="actionDone"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
и всё получится
Note the use of two optional attributes.
In conjunction with android:inputType=”text”, android:imeOptions=”actionDone” configures the soft keyboard to show a Done key in place of the Enter key.
SINIGR
1 / 1 / 1
Регистрация: 24.07.2011
Сообщений: 34
07.12.2014, 15:10  [ТС]     Обработка нажатий клавиш программной клавиатуры #16
Armagedo, да, действительно. Спасибо. Теперь буду разбирать документацию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2015, 17:38     Обработка нажатий клавиш программной клавиатуры
Еще ссылки по теме:

Обработка нажатий клавиш громкости непосредственно Service (Activity уже закрыто) Android
Обработка нажатий на виджет Android
Обработка нажатий на сам фрагмент а не на отдельную кнопку Android
Обработка нажатий кнопок созданных программно в заданном месте разметки Android
Android Кнопка со счётчиком нажатий

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
sasha77ru
0 / 0 / 0
Регистрация: 01.11.2015
Сообщений: 1
01.11.2015, 17:38     Обработка нажатий клавиш программной клавиатуры #17
Мне понравился вариант с TextWatcher от Armagedo. У меня все равно TextWatcher на поле висит. Только вместо:
Java
1
if (s.charAt(start)=='\n')
надо писать:
Java
1
if ((s.length()>start)&&(s.charAt(start)=='\n'))
а то она выдает "java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0" если пользователь нажимает Backspace.
Yandex
Объявления
01.11.2015, 17:38     Обработка нажатий клавиш программной клавиатуры
Ответ Создать тему
Опции темы

Текущее время: 22:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru