2011-12-23 29 views
16

Cách chọn một từ trên một vòi nước trong TextView/EditText trong android. Tôi có một số văn bản trong một TextView/EditText và khi người dùng chạm vào một từ, tôi muốn từ đó được chọn và sau đó khi tôi gọi phương thức getSelectedText() giống như nó sẽ trả lại cho tôi từ đã chọn. Mọi trợ giúp sẽ được đánh giá cao.chọn một từ trên một vòi nước trong TextView/EditText

Mục tiêu của tôi là thực hiện một số hành động khi người dùng chạm vào một từ cụ thể trong TextView/EditText.

Trả lời

29

UPDATE: Một cách tiếp cận tốt hơn là sử dụng 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); 
     } 
    }; 
} 

OLD ĐÁP

tôi muốn xử lý nhấp vào của tôi Hoạt động của riêng mình. Tôi đã giải quyết nó bằng cách làm theo mã:

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]); 
} 
+3

Đây là câu trả lời hay nhất nếu bạn đang xem xét giải pháp người nghe và không có ý định. Không phải tất cả các vấn đề đều được liên kết với một URL hoặc một lược đồ. Trong trường hợp của tôi, tôi đã xem xét một giải pháp đơn giản để tìm hiểu từ nào đã được khai thác trong một lần xem văn bản. Không có giải pháp tốt cho đến khi tôi thấy điều này. Giải pháp này chỉ hoạt động hoàn hảo. Nó làm tương tự như những gì textview có thể nhấp được nhưng phần tốt nhất là chúng tôi đang kiểm soát để có hành động có liên quan. Tôi đã làm một thay đổi mặc dù mã trên. Với mã trên, tất cả các từ xuất hiện dưới dạng liên kết nhưng tôi không muốn. Vì vậy, chỉ cần nhận xét super.updateDrawState. –

+0

Cảm ơn bạn rất nhiều vì tôi đã làm việc này từ 2 ngày qua và cuối cùng tôi giải quyết nó bằng cách sử dụng mã của bạn. Cám ơn bạn một lần nữa. –

+1

Cảm ơn bạn M-WaJeEh. Làm việc như người ở. Và cũng nhờ Deepak cho rằng thêm chút mà tôi muốn. – Manu

0

Sử dụng Linkify, Sử dụng Cụm từ thông dụng của riêng bạn để gọi thói quen của bạn khi nhấp vào một từ.

Xem ở đây cho WikiWord Example and Relevant Blogpost

+0

Tuyệt vời. Nhưng tôi muốn xử lý sự kiện nhấp qua người nghe, không phải thông qua Intents :) –

Các vấn đề liên quan