Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 24.08.2015
Сообщений: 37
1

Как понять, что пользователь закончил ввод текста в поле?

21.04.2017, 21:13. Показов 1463. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
стоит задача сделать примерно такой функционал:
пользователь вводит с клавиатуры телефона какой-то текст, и есть пользователь на какое-то время (скажем, на полсекунды) прекращает ввод, то срабатывает некоторое действие. как можно это сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2017, 21:13
Ответы с готовыми решениями:

Как понять, что пользователь кликнул по двум разным объектам?
Создаю нечто похожее на пазлы, где нужно нажать на одну плитку, затем на вторую, запомнить их...

Как понять, что записано в битовом поле?
Здравствуйте. Как в БД Paradox понять значение, если поле типа binary storage? Есть сама таблица с...

Как определить, что пользователь ничего не ввел в поле?
Доброго времени суток! Задание такое: "дан файл, содержащий сведения об учениках школ: указывается...

Программный ввод текста в активное поле, как сделать чтобы у поля не пропадал фокус
У меня форма с несколькими textBox'ами и 10 button's, кнопки допустим как на калькуляторе от 0 до...

2
33 / 35 / 9
Регистрация: 03.02.2017
Сообщений: 141
21.04.2017, 22:17 2
Создаёте слушателя ввода текста TextWatcher. Вешаете его на своё поле ввода и используете оператор debounce(long timeout) который передаёт данные тогда когда определённое время наблюдения с объектом не происходят никакие изменения - ваш случай. С использованием Rx код будет выглядеть следующим образом:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
EditText searchField;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        searchField = (EditText) findViewById(R.id.searchField);
 
        createSearchFieldObservable()
                .debounce(500, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(@NonNull String text) throws Exception {
                        Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
                    }
                });
    }
 
    private Observable<String> createSearchFieldObservable() {
        return Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull final ObservableEmitter<String> emitter) throws Exception {
                final TextWatcher textChangeObserver = new TextWatcher() {
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                        emitter.onNext(s.toString());
                    }
 
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) { /*NOP*/ }
 
                    @Override
                    public void afterTextChanged(Editable s) { /*NOP*/ }
                };
 
                searchField.addTextChangedListener(textChangeObserver);
 
                emitter.setCancellable(new Cancellable() {
                    @Override
                    public void cancel() throws Exception {
                        searchField.removeTextChangedListener(textChangeObserver);
                    }
                });
            }
        });
    }
Добавлено через 14 минут
Если использовать ту же библиотечку RxBinding то код вообще получится в несколько строк:
Java
1
2
3
4
5
6
7
8
9
RxTextView.textChanges(searchField)
                .debounce(500, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<CharSequence>() {
                    @Override
                    public void accept(@NonNull CharSequence text) throws Exception {
                        // do some stuff
                    }
                });
1
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
24.04.2017, 13:00 3
Или можно обойтись без RxJava
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
 
import java.lang.ref.WeakReference;
 
public final class EditTextDebounce {
    private final WeakReference<EditText> editTextWeakReference;
    private final Handler debounceHandler;
    private DebounceCallback debounceCallback;
    private Runnable debounceWorker;
    private int delayMillis;
    private final TextWatcher textWatcher;
 
    public static EditTextDebounce create(@NonNull EditText editText) {
        return new EditTextDebounce(editText);
    }
 
    public static EditTextDebounce create(@NonNull EditText editText, int delayMillis) {
        EditTextDebounce editTextDebounce = new EditTextDebounce(editText);
        editTextDebounce.setDelayMillis(delayMillis);
        return editTextDebounce;
    }
 
    private EditTextDebounce(@NonNull EditText editText) {
        this.debounceHandler = new Handler(Looper.getMainLooper());
        this.debounceWorker = new DebounceRunnable("", null);
        this.delayMillis = 300;
        this.textWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                //unused
            }
 
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //unused
            }
 
            @Override
            public void afterTextChanged(Editable s) {
                debounceHandler.removeCallbacks(debounceWorker);
                debounceWorker = new DebounceRunnable(s.toString(), debounceCallback);
                debounceHandler.postDelayed(debounceWorker, delayMillis);
            }
        };
        this.editTextWeakReference = new WeakReference<>(editText);
        EditText editTextInternal = this.editTextWeakReference.get();
        if (editTextInternal != null) {
            editTextInternal.addTextChangedListener(textWatcher);
        }
    }
 
    public void watch(@Nullable DebounceCallback debounceCallback) {
        this.debounceCallback = debounceCallback;
    }
 
    public void watch(@Nullable DebounceCallback debounceCallback, int delayMillis) {
        this.debounceCallback = debounceCallback;
        this.delayMillis = delayMillis;
    }
 
    public void unwatch() {
        if (editTextWeakReference != null) {
            EditText editText = editTextWeakReference.get();
            if (editText != null) {
                editText.removeTextChangedListener(textWatcher);
                editTextWeakReference.clear();
                debounceHandler.removeCallbacks(debounceWorker);
            }
        }
    }
 
    private void setDelayMillis(int delayMillis) {
        this.delayMillis = delayMillis;
    }
 
    private static class DebounceRunnable implements Runnable {
 
        private final String result;
        private final DebounceCallback debounceCallback;
 
        DebounceRunnable(String result, DebounceCallback debounceCallback) {
            this.result = result;
            this.debounceCallback = debounceCallback;
        }
 
        @Override
        public void run() {
            if (debounceCallback != null) {
                debounceCallback.onFinished(result);
            }
        }
    }
 
    public interface DebounceCallback {
        void onFinished(@NonNull String result);
    }
 
}
И вызывать
Java
1
2
3
4
5
6
7
        EditTextDebounce.create(fieldName)
                .watch(new EditTextDebounce.DebounceCallback() {
                    @Override
                    public void onFinished(@NonNull String result) {
                        Log.i(getClass().getSimpleName(), "onFinished: " + result);
                    }
                }, 1000);
1
24.04.2017, 13:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2017, 13:00
Помогаю со студенческими работами здесь

Как узнать что WinSock закончил загрузку файла?
Здравствуйте! Наверняка, все кто начинали работать с winsock спрашивали о том-же, что и я сейчас...

Как узнать, что клиет закончил отсылать пакеты?
Забиндил локалхост, посылаю на него пакеты последовательно одной секцией sequence number, после...

Ввод текста, обработка и вывод текста в то же поле
Здравствуйте!Как сделать в delphi 10 seattle нечто вроде экспертных систем?Вводим текст (типа как в...

Как уведомить первый поток о том, что второй закончил свою работу
Добрый день. Проблема такая. Есть 2 класса. Первый MyLogic - отвечает за логику приложения,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru