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

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

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

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

06.12.2014, 16:34. Просмотров 2966. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2014, 16:34     Обработка нажатий клавиш программной клавиатуры
Посмотрите здесь:
Обработка нажатий клавиш громкости непосредственно Service (Activity уже закрыто) Android
Android Обработка нажатий
Обработка нажатий на виджет Android
Fragment обработка нажатий Android
Android Sliding Menu обработка нажатий
Обработка нажатий внутри класса адаптера Android
Обработка нажатий на сам фрагмент а не на отдельную кнопку Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1566 / 1308 / 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
1566 / 1308 / 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
1566 / 1308 / 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
1566 / 1308 / 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     Обработка нажатий клавиш программной клавиатуры
Еще ссылки по теме:
Обработка нажатий кнопок созданных программно в заданном месте разметки Android
Android Можно ли улавливать нажатия клавиш стороней клавиатуры?
Как убрать preview клавиш со своей клавиатуры? 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     Обработка нажатий клавиш программной клавиатуры
Ответ Создать тему
Опции темы

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