Непрерывное сообщение, пока используется EditText - PullRequest
0 голосов
/ 20 октября 2019

Мы пытаемся реализовать сообщение «Пользователь печатает», пока пользователь продолжает печатать в пределах определенного EditText. Например, как только пользователь начнет печатать в EditText, и после того, как с момента последнего события ввода не прошло 2 секунды, продолжайте показывать сообщение «Пользователь печатает».

Любая идея, как этого добитьсялегко, не блокируя какие-либо темы?

Спасибо! Yohay

Ответы [ 2 ]

0 голосов
/ 20 октября 2019

Как только пользователь начнет печатать, запустите фоновый поток (BT) и передайте text ваших edit text через Message на BT. После каждых 2 секунд пинг (отправка message) на ваш Main Thread с BT. Получив message в MainThread, передайте message, содержащий text в вашем edit text, на ваш BT. Получив message в BT, просто сравните text только что полученный с previous text passed в BT. Если оба texts одинаковы, пользователь не печатает. Но пользователь может начать печатать снова в любой момент, поэтому продолжайте играть в эту игру в фоновом режиме, пока сообщение не станет живым (ни отправлено, ни удалено). Как только закончится жизнь сообщения, убейте BT.

Редактируйте пример кода

public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";

private boolean killThread = false;
private EditText editText;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    editText = findViewById(R.id.editText);
    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View view, boolean hasFocus) {
            if (hasFocus) {
                Log.d(TAG, "onFocusChange: gained focus");
                startThread(new WeakReference<MainActivity>(MainActivity.this));
            }
        }
    });

    Button button = findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            // for simplicity killing thread here
            killThread = true;
        }
    });
}

private void startThread(final WeakReference<MainActivity> activityWeakReference) {
    new Thread(new Runnable() {
        String savedText = "";

        @Override
        public void run() {
            do {
                MainActivity activity = activityWeakReference.get();
                if (null == activity) {
                    // Activity destroyed, killME!!!
                    killThread = true;
                    Log.e(TAG, "run: activity reference null, killing MYSELF??");
                } else {
                    if (savedText.equals(activity.editText.getText().toString())) {
                        Log.e(TAG, "run: user is not typing");
                    } else {
                        savedText = activity.editText.getText().toString();
                        Log.e(TAG, "run: user typing ");

                    }

                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            } while (!killThread);
        }
    }).start();

}

}

Когда EditText получает фокус, я запускаю тему (прохождениеWeakReference до Activity), а затем с помощью WeakReference захватывает EditText и проверяет его Text. Для простоты я просто убиваю Thread на Button Click.

0 голосов
/ 20 октября 2019

вы можете справиться с этим с помощью focusChangeListener

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View view, boolean hasFocus) {
        if (hasFocus) {
            //user typing
        } else {
            //user stop typing
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...