在TextView / EditText中select一个单词

如何在android中的TextView / EditText中的水龙头上select一个单词。 我在TextView / EditText有一些文本,当用户点击一个单词时,我想要select这个单词,然后当我调用getSelectedText()方法时,它应该返回给我所选的单词。 任何帮助将不胜感激。

我的目标是在用户点击TextView / EditText的特定单词时执行一些操作。

更新:另一个更好的方法是使用BreakIterator

 private void init() { String definition = "Clickable words in text view ".trim(); TextView definitionView = (TextView) findViewById(R.id.text); definitionView.setMovementMethod(LinkMovementMethod.getInstance()); definitionView.setText(definition, BufferType.SPANNABLE); Spannable spans = (Spannable) definitionView.getText(); BreakIterator iterator = BreakIterator.getWordInstance(Locale.US); iterator.setText(definition); int start = iterator.first(); for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator .next()) { String possibleWord = definition.substring(start, end); if (Character.isLetterOrDigit(possibleWord.charAt(0))) { ClickableSpan clickSpan = getClickableSpan(possibleWord); spans.setSpan(clickSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } private ClickableSpan getClickableSpan(final String word) { return new ClickableSpan() { final String mWord; { mWord = word; } @Override public void onClick(View widget) { Log.d("tapped on:", mWord); Toast.makeText(widget.getContext(), mWord, Toast.LENGTH_SHORT) .show(); } public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); } }; } 

老解答

我想在我自己的活动中处理点击。 我通过下面的代码解决了它:

 private void init(){ String definition = "Clickable words in text view ".trim(); TextView definitionView = (TextView) findViewById(R.id.definition); definitionView.setMovementMethod(LinkMovementMethod.getInstance()); definitionView.setText(definition, BufferType.SPANNABLE); Spannable spans = (Spannable) definitionView.getText(); Integer[] indices = getIndices( definitionView.getText().toString(), ' '); int start = 0; int end = 0; // to cater last/only word loop will run equal to the length of indices.length for (int i = 0; i <= indices.length; i++) { ClickableSpan clickSpan = getClickableSpan(); // to cater last/only word end = (i < indices.length ? indices[i] : spans.length()); spans.setSpan(clickSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); start = end + 1; } } private ClickableSpan getClickableSpan(){ return new ClickableSpan() { @Override public void onClick(View widget) { TextView tv = (TextView) widget; String s = tv .getText() .subSequence(tv.getSelectionStart(), tv.getSelectionEnd()).toString(); Log.d("tapped on:", s); } public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); } }; } public static 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]); } 

使用Linkify ,使用您自己的正则expression式来点击单词来调用您的例程。

在这里查看WikiWord示例和相关的博文