Intereting Posts
Одновременно используйте GPS и Network Provider в Android Сканирование QR-кода с использованием Android Mobile Vision API Цветная коробка с буквами a la Gmail Внедрение приложения для Android в приложении Как отлаживать приложение для Android, построенное с помощью maven Получение координат GPS быстрее программно без Интернета, но с использованием сетевого провайдера и мобильного GPS Исключение нулевого указателя на mapFragment.getMapAsync (это) при инициализации карты google Как использовать платную версию моего приложения в качестве «ключа» для бесплатной версии? Ошибка обратного вызова для передачи: результат = ОТМЕНА forIntent {act = com.google.android.c2dm.intent.RECEIVE pkg = com.flagg327.guicomaipu (есть дополнительные функции)} Android: показать / скрыть представление, используя анимацию Фильтр шума данных акселерометра Перехват ссылок из браузера, чтобы открыть приложение для Android Исключение при фокусировке EditText в PopupWindow, запущенном на устройстве Загрузить загруженный Gif-образ в android Как можно раздуть макет, содержащий список в диалоговом окне предупреждения?

Как я могу использовать onTouchListeners для каждого слова в TextView?

Я хотел бы назначить onTouchListeners каждому слову в TextView. (Не ссылаться на что-то в Интернете, а просто продолжать логику игры внутри приложения). Общее действие моей игры на данный момент – увидеть TextView, коснуться слова, если это целевое слово, которое вы выиграли, иначе загрузите другой TextView на основе слова, которое вы касаетесь и повторяете. Как я это делаю сейчас, с ClickableSpans и onClicks для каждого слова.

Но я предпочел бы иметь onTouchListeners, чтобы я мог изменить цвет фона слова на touch_down и сделать логику игры на touch_up, чтобы он выглядел более отзывчивым. Как я могу это сделать?

final TextView defTV = (TextView) findViewById(R.id.defTV); text = new SpannableString(rv); // rv is the future clickable TextView text ClickableSpan clickableSpan = null; String regex = "\\w+"; Pattern p = Pattern.compile(regex); Matcher matcher = p.matcher(text); while (matcher.find()) { final int begin = matcher.start(); final int end = matcher.end(); clickableSpan = new ClickableSpan() { public void onClick(View arg0) { String lword = (String) text.subSequence(begin, end).toString(); if (lword.equalsIgnoreCase(targetword)) { // WIN } else { // Build new TextView based on lword, start over } } }; text.setSpan(clickableSpan, begin, end, 0); } 

Solutions Collecting From Web of "Как я могу использовать onTouchListeners для каждого слова в TextView?"

Поэтому я скопировал ClickableSpan.java и сделал TouchableSpan.java:

 import android.text.TextPaint; import android.text.style.CharacterStyle; import android.text.style.UpdateAppearance; import android.view.MotionEvent; import android.view.View; /** * If an object of this type is attached to the text of a TextView * with a movement method of LinkTouchMovementMethod, the affected spans of * text can be selected. If touched, the {@link #onTouch} method will * be called. */ public abstract class TouchableSpan extends CharacterStyle implements UpdateAppearance { /** * Performs the touch action associated with this span. * @return */ public abstract boolean onTouch(View widget, MotionEvent m); /** * Could make the text underlined or change link color. */ @Override public abstract void updateDrawState(TextPaint ds); } 

И я LinkMovementMethod.java в LinkTouchMovementMethod.java . Метод onTouchEvent тот же самый, за исключением того, что упоминание onClick изменяется на onTouch и добавляется новая строка:

 import android.text.Layout; import android.text.Selection; import android.text.Spannable; import android.text.method.LinkMovementMethod; import android.view.MotionEvent; import android.widget.TextView; public class LinkTouchMovementMethod extends LinkMovementMethod { @Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); TouchableSpan[] link = buffer.getSpans(off, off, TouchableSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { link[0].onTouch(widget,event); //////// CHANGED HERE } else if (action == MotionEvent.ACTION_DOWN) { link[0].onTouch(widget,event); //////// ADDED THIS Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); } return true; } else { Selection.removeSelection(buffer); } } return super.onTouchEvent(widget, buffer, event); } } 

И установите MovementMethod соответствующим образом в свой код:

 TextView tv = (TextView) findViewById(R.id.tv); tv.setMovementMethod(new LinkTouchMovementMethod()); 

Теперь, чтобы показать текст:

 touchableSpan = new TouchableSpan() { public boolean onTouch(View widget, MotionEvent m) { ... } public void updateDrawState(TextPaint ds) { ds.setUnderlineText(false); ds.setAntiAlias(true); } }; String rv = "Text to span"; text = new SpannableString(rv); text.setSpan(touchableSpan, begin, end, 0); tv.setText(text, BufferType.SPANNABLE);