2013-01-03 43 views
6

Có thể thêm onclick vào một số phần của một lần xem văn bản không? Ví dụ: mã của tôi giống như thế này,TextView - OnClick - Android

String content = "Hello this a test.. For more details contact @Peter"; 
someTextView.setText(content); 

Tôi muốn thêm sự kiện onClick cho "@Peter". Điều đó có thể không?

TIA.

+0

bạn muốn thêm 'onclick' vào toàn bộ' textview' hoặc chỉ ** @ Peter **? – Renjith

+0

Điều này có thể giúp bạn: http://stackoverflow.com/questions/2734270/how-do-i-make-links-in-a-textview-clickable hoặc bạn có thể làm điều đó với Spannables và IntentSpan. – Thommy

+0

@RKN thêm 'onclick' chỉ ** ** Peter ** – Naveen

Trả lời

2

Điều này có thể khô héo sử dụng mã Java:

someTextView.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(){ 
     //Do Stuff 
    } 
}); 

Nhưng trước tiên hãy chắc chắn rằng bạn thiết lập nó nhấp được.

someTextView.setClickable(true); 
+2

Tôi muốn' onclick' chỉ cho một số phần của textview chứ không phải cho toàn bộ textview. – Naveen

4

Trong bạn Xml thêm này, android:clickable="true"

trong bạn sử dụng hoạt động như thế này,

textView.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(){ 

    } 
} 
+1

Thao tác này sẽ thêm sự kiện nhấp cho toàn bộ chế độ xem văn bản .. Tôi muốn thêm nó cho chỉ một phần .. trong trường hợp được đề cập ở trên cho ** @ Peter ** – Naveen

+0

@Peter: Tham khảo liên kết này, tôi hy vọng điều này có thể giúp bạn http://adilatwork.blogspot.in/2011/07/android-how-to-make-only-part-of.html – Aerrow

7

đơn giản: -)

SpannableString link = makeLinkSpan("@Peter", new View.OnClickListener() {   
     @Override 
     public void onClick(View v) { 
      // Peforme Click 
     } 
    }); 
String content = "Hello this a test.. For more details contact"; 
someTextView.setText(content); 
someTextView.append(link); 

makeLinkSpan() phương pháp là

private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener) { 
    SpannableString link = new SpannableString(text); 
    link.setSpan(new ClickableString(listener), 0, text.length(), 
     SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); 
    return link; 
} 

ClickableString Lớp

private static class ClickableString extends ClickableSpan { 
    private View.OnClickListener mListener;   
    public ClickableString(View.OnClickListener listener) {    
     mListener = listener; 
    }   
    @Override 
    public void onClick(View v) { 
     mListener.onClick(v); 
    }   
} 
+0

Bây giờ, bạn chỉ có sự kiện Nhấp cho văn bản "@Peter". Không cho TextView hoàn chỉnh. Có nghĩa là từ của bạn @Peter được liên kết .. – user370305

1

Hãy thử điều này:

SpannableString str = new SpannableString("@Peter"); 
str.setSpan(new ClickableSpan() { 

      @Override 
      public void onClick(View widget) { 
       // TODO Auto-generated method stub 

      } 
     }, 0, str.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 

Sau đó thêm str để TextView của mình.

Bạn cũng cần phải gọi setMovementMethod(LinkMovementMethod.getInstance()); trên TextView của mình

3

Nhờ @ user370305 cho các phản ứng .. Tuy nhiên ông đã bỏ lỡ một số đoạn mã trong câu trả lời của mình .. Vì lợi ích của người khác, tôi đang dán toàn bộ mã đã làm việc cho tôi,

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     TextView someTextView = (TextView)findViewById(R.id.someTextView); 

     String content = "Hello this a test.. For more details contact"; 
     someTextView.setText(content); 

     SpannableString link = makeLinkSpan("@Peter", new View.OnClickListener() {   
       @Override 
       public void onClick(View v) { 
        //Do something here.. 
       } 
      }); 
      someTextView.append(link); 
     } 
     makeLinksFocusable(someTextView); 
    } 

    private void makeLinksFocusable(TextView tv) { 
     MovementMethod m = tv.getMovementMethod(); 
     if ((m == null) || !(m instanceof LinkMovementMethod)) { 
      if (tv.getLinksClickable()) { 
       tv.setMovementMethod(LinkMovementMethod.getInstance()); 
      } 
     } 
    } 

    private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener)     { 
     SpannableString link = new SpannableString(text); 
     link.setSpan(new ClickableString(listener), 0, text.length(), 
      SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); 
     return link; 
    } 

    private static class ClickableString extends ClickableSpan { 
     private View.OnClickListener mListener;   
     public ClickableString(View.OnClickListener listener) {    
      mListener = listener; 
     }   
     @Override 
     public void onClick(View v) { 
      mListener.onClick(v); 
     }   
    }