Как получить х, у позиции кликаемого диапазона в Android TextView? - PullRequest
0 голосов
/ 13 мая 2019

У меня есть spanningable Textview.Я хочу показать всплывающее окно поверх выбранного промежутка внутри TextView.как это:

enter image description here

мой код:

String definition = textView.getText().toString().trim();
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(definition, TextView.BufferType.SPANNABLE);

Spannable spans = (Spannable) textView.getText();
Integer[] indices = getIndices(
  textView.getText().toString(), ' ');
int start = 0;
int end = 0;

for (int i = 0; i <= indices.length; i++) {
  ClickableSpan clickSpan = getClickableSpan();
  end = (i < indices.length ? indices[i] : spans.length());
  spans.setSpan(clickSpan, start, end,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  start = end + 1;
  }

private Integer[] getIndices(String s, char c) {
int           pos     = s.indexOf(c, 0);
List<Integer> indices = new ArrayList<Integer>();
while (pos != -1) {
  indices.add(pos);
  pos = s.indexOf(c, pos + 1);
}
return (Integer[]) indices.toArray(new Integer[0]);
}

private ClickableSpan getClickableSpan() {
return new ClickableSpan() {
  @SuppressLint("ClickableViewAccessibility")
  @Override
  public void onClick(View widget) {
    TextView tv = (TextView) widget;
    final String word = tv
            .getText()
            .subSequence(tv.getSelectionStart(),
                    tv.getSelectionEnd()).toString();

    tv.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        popup(word, (int) event.getRawX(), (int) event.getRawY());
        return false;
      }
    });

  }

};
}

какВы видите, что код изображения работает, но из-за того, что onTouch вызывается раньше onClick в Android, всплывающее окно показывает слово, которое щелкнуло в предыдущем шаге.извините за майский плохой английский.

1 Ответ

0 голосов
/ 13 мая 2019

Чтобы получить x и y, вы можете установить OnTouchListener для регистрации события клика

В Java

private void setOnTouchListener() {
    textView.setOnTouchListener((view, event) -> {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            float clickedX = event.getX();
            float clickedY = event.getY();
        }

        return false;
    });
}

В Kotlin

private fun setOnTouchListener() {
    text_view.setOnTouchListener { view, event ->
        if (event?.action == MotionEvent.ACTION_DOWN) {
            val clickedX = event.x
            val clickedY = event.y
        }

        false
    }
}
...