Вопрос Повторить задачу с задержкой времени? говорит о повторяющейся задаче в рамках действия. Ответ на верхний голос хорошо подходит для этой ситуации. Я пытаюсь сделать мигающий курсор внутри полностью настраиваемого EditText. Я попытался скопировать и адаптировать код с Android TextView
и Editor
, но мне нечего было мигать.
Вот некоторые из текущего кода, который я пытался найти:
private boolean shouldBlink() {
if (!mCursorVisible || !isFocused()) return false;
final int start = getSelectionStart();
if (start < 0) return false;
final int end = getSelectionEnd();
if (end < 0) return false;
return start == end;
}
void makeBlink() {
if (shouldBlink()) {
mShowCursor = SystemClock.uptimeMillis();
if (mBlink == null) mBlink = new Blink();
this.removeCallbacks(mBlink);
this.postDelayed(mBlink, BLINK);
} else {
if (mBlink != null) this.removeCallbacks(mBlink);
}
}
private class Blink implements Runnable {
private boolean mCancelled;
public void run() {
if (mCancelled) {
return;
}
MongolEditText.this.removeCallbacks(this);
if (shouldBlink()) {
if (mLayout != null) {
MongolEditText.this.invalidateCursorPath();
}
MongolEditText.this.postDelayed(this, BLINK);
}
}
void cancel() {
if (!mCancelled) {
MongolEditText.this.removeCallbacks(this);
mCancelled = true;
}
}
void uncancel() {
mCancelled = false;
}
}
private void invalidateCursorPath() {
int start = getSelectionStart();
if (start < 0) return;
Rect cursorPath = getCursorPath(start);
invalidate(cursorPath.left, cursorPath.top, cursorPath.right, cursorPath.bottom);
}
private void suspendBlink() {
if (mBlink != null) {
mBlink.cancel();
}
}
private void resumeBlink() {
if (mBlink != null) {
mBlink.uncancel();
makeBlink();
}
}
@Override
public void onScreenStateChanged(int screenState) {
switch (screenState) {
case View.SCREEN_STATE_ON:
resumeBlink();
break;
case View.SCREEN_STATE_OFF:
suspendBlink();
break;
}
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
resumeBlink();
}
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
suspendBlink();
}
Я решил, что мне нужно отступить и решить проблему с более легким примером, поэтому я создаю MCVE. Мой ответ (если я могу это сделать) ниже. Мои цели заключаются в следующем:
- Представление запускает повторяющуюся задачу при нажатии.
- Выполняемый код обработчика должен быть отменен при уничтожении представления.
Мой основной вопрос: как заставить представление начать свою собственную повторяющуюся задачу, которая меняет внешний вид? (например, мигание и выключение)