Позиция OnClick в String в TextView
Я не уверен, как это сделать, но мне было интересно, есть ли способ получить позицию (индекс) в String в TextView, когда человек щелкнет где-нибудь в TextView. Итак, если кто-то нажимает на следующий TextView:
Hello I'm Vinay Hiremath.
в первом "H", событие onClick получит целое число 0. Или, если кто-то нажимает на "V", он получит 10 и т.д.
Любая помощь, как всегда, очень ценится. Не стесняйтесь называть меня идиотом и бросать камни, если это явно на Android-разработчиках.
Ответы
Ответ 1
Итак, я решил это решить по ссылке в комментарии Джеймса Мур здесь. В итоге я использовал решение Tony Blues. Это решение таково:
1.) Установите onTouchListener в TextView.
2.) Получите макет TextView.
3.) Получите координаты x, y касания через событие.
4.) Найдите строку и смещение (индекс) на основе этого события.
Следующий пример кода - это то, как можно было бы использовать (в подробном) индекс касания, заданный обработкой имени TextView:
manip.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
Layout layout = ((TextView) v).getLayout();
int x = (int)event.getX();
int y = (int)event.getY();
if (layout!=null){
int line = layout.getLineForVertical(y);
int offset = layout.getOffsetForHorizontal(line, x);
Log.v("index", ""+offset);
}
return true;
}
});
РЕДАКТОР: Рахул Мандалия привлек мое внимание, что этот код не сработает, если в текстовом представлении есть отступы. К сожалению, прошло очень много времени с тех пор, как я написал любой Android-код, поэтому я не уверен, как обновить этот ответ для учетной записи. Интуитивно кажется, что вы можете сделать какую-то проверку против события click, если знаете значение дополнения. Извините, что я не могу быть более полезным в этом случае.: - (
Ответ 2
Если вы выполняете принятый ответ, вы можете заметить, что событие onTouch
создается более одного раза каждый раз, когда пользователь касается экрана. Используйте event.getAction()
, чтобы узнать, какие действия обрабатываются. Это зависит от поведения пользователя, вызвавшего событие. Например, при простом касании экрана событие onTouch
срабатывает дважды с действиями ACTION_DOWN
и ACTION_UP
. Для касания и перемещения вы будете получать разные действия в зависимости от перемещения (внутри элемента управления, извне внутрь, или наоборот). Подробнее см. MotionEvent.
Следующий код представляет собой модифицированную версию принятого ответа, которая обрабатывает только действие ACTION_DOWN
:
manip.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Layout layout = ((TextView) v).getLayout();
int x = (int)event.getX();
int y = (int)event.getY();
if (layout!=null){
int line = layout.getLineForVertical(y);
int offset = layout.getOffsetForHorizontal(line, x);
Log.v("index", ""+offset);
}
}
return true;
}
});
Ответ 3
1) Возьмите список.
2) разделите эту строку на отдельный символ.
3) возьмите setOnItemClickListener (новое событие OnItemClickListener()).
4) показать Toast для каждого символа с помощью аргументов charcter.
Это поможет вам.
Ответ 4
Возьмите это с щепоткой соли, поскольку у меня не было возможности проверить это.
Установите атрибут android:textIsSelectable
в true
для TextView
, а затем используйте getSelectionStart()
и getSelectionEnd()
.
Снова я действительно просто получаю обоснованное предположение.