Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
SINIGR
1 / 1 / 4
Регистрация: 24.07.2011
Сообщений: 34
1

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

06.12.2014, 16:34. Просмотров 4101. Ответов 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();
                 }
        }
}
);
Каким образом можно реализовать данное поведение?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2014, 16:34
Ответы с готовыми решениями:

Обработка нажатий клавиш громкости непосредственно Service (Activity уже закрыто)
Уважаемые форумчане! Буду благодарен за любую помощь. Написал добрую...

Обработка нажатий
Господа подскажите как определить что пользователь провел пальцем влево или в...

Обработка нажатий в TabLayout
Друзья, привет, вопрос следующий, я разобрался с TabLayout, но только при...

Обработка нажатий на виджет
Подскажите пожалуйста. Из уроков так и не понял. 1 Как сделать чтобы при...

Обработка нажатий на виджет
Почему не работает при нажатии на виджет? @Override public void...

16
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
06.12.2014, 19:15 2
SINIGR, Вам нужен OnEditorActionListener.
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
06.12.2014, 20:39 3
...или TextWatcher
0
SINIGR
1 / 1 / 4
Регистрация: 24.07.2011
Сообщений: 34
06.12.2014, 23:47  [ТС] 4
TextWatcher здесь не подойдет, насколько я понимаю, хотя, конечно, могу быть не прав.

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

Решение

Предупреждаю сразу - это чисто в доказательство реализации через 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);
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 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;
            }
        });
1
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
07.12.2014, 12:02 7
YuraAAA, ну выковривание 'энтер' и налепливание 'дан' на программной клавиатуре тоже как-бы не особо...
На физической клавиатуре тоже так можно?
0
SINIGR
1 / 1 / 4
Регистрация: 24.07.2011
Сообщений: 34
07.12.2014, 12:30  [ТС] 8
Вариант с TextWatcher по крайней мере работает, кое-как, а вот с setOnEditorActionListener у меня не ловит события, причем сделал все в том же виде, что и у вас.
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
07.12.2014, 12:38 9
Еще один
Что значит "кое-как"?
Как вы измерили эту величину и в чем отличие от реализованных вами методов, которые работают "не кое-как"?
1
SINIGR
1 / 1 / 4
Регистрация: 24.07.2011
Сообщений: 34
07.12.2014, 12:43  [ТС] 10
Armagedo, вам большое спасибо за это, все работает, но просто интересно, это единственный способ, нет ли аналогичного способа как с обработкой физической клавиатуры
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
07.12.2014, 13:03 11
Armagedo,
Цитата Сообщение от Armagedo Посмотреть сообщение
ну выковривание 'энтер' и налепливание 'дан' на программной клавиатуре тоже как-бы не особо...
что значит не очень, если на это рассчитан этот функционал?оО
0
SINIGR
1 / 1 / 4
Регистрация: 24.07.2011
Сообщений: 34
07.12.2014, 13:28  [ТС] 12
В общем, спасибо всем, получилось сделать все как нужно!

Добавлено через 1 минуту
YuraAAA, И все таки, через setOnEditorActionListener у меня не отлавливались события, вы можете предположить с чем это связанно?
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
07.12.2014, 13:30 13
SINIGR, покажите код. Как Вы проверили, что не ловится? Я такого не видел ещё =)
0
SINIGR
1 / 1 / 4
Регистрация: 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"/>
На экран ничего не выводит, просто происходит переход на след. строку
0
Armagedo
209 / 209 / 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.
1
SINIGR
1 / 1 / 4
Регистрация: 24.07.2011
Сообщений: 34
07.12.2014, 15:10  [ТС] 16
Armagedo, да, действительно. Спасибо. Теперь буду разбирать документацию.
0
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.
0
01.11.2015, 17:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2015, 17:38

Fragment обработка нажатий
Здравствуйте. Есть 9 Layout-ов. Каждый выступает в роли контейнера для...

Sliding Menu обработка нажатий
Кто нибудь использовал данную библиотеку? menu = new SlidingMenu(this);...

Обработка нажатий внутри класса адаптера
Можно ли обрабатывать нажатия в классе адаптера expandablelistview? Если нет,...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

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