2013-07-20 34 views
6

Tôi có một textview với một chuỗi html với neo trong đó. Khi tôi nhấp vào textview tôi muốn gọi ví dụ như một phương pháp được gọi là A, và khi tôi nhấp vào một liên kết trong textview tôi muốn gọi một phương pháp gọi là B. Tôi đã làm việc này nhưng tôi có một vấn đề: khi tôi nhấp vào một liên kết, phương pháp B được gọi, nhưng phương thức A cũng được gọi. Làm thế nào tôi có thể đảm bảo chỉ có phương thức B, chứ không phải B và A, được gọi khi tôi nhấp vào một liên kết?Textview onclicklistener với các liên kết

Mã của tôi:

for (int i = 0; i < ingevoegd.length(); i++) { 
     JSONObject soortingevoegd = ingevoegd.getJSONObject(i); 
     String type = soortingevoegd.getString("type");   
     if (type.equals("Vis")) { 
      String link = "<a href = 'com.aquariumzoeken.pro://Soortweergave?selected=" 
        + naam + "&type=Vis" + "'>" + naam + "</a>"; 
      text = text.replaceAll(naam, link); 
     } 
    } 

    TextView texttv = (TextView) v.findViewById(R.id.textviewer); 


    texttv.setText(Html.fromHtml(text)); 
    texttv.setMovementMethod(LinkMovementMethod.getInstance()); 

Và TextView OnClickListener sự:

texttv.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      try { 

       switchToEditMode sw = new switchToEditMode(); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
    }); 

Cảm ơn trước, Simon

+0

Các bạn đã cố gắng tạo điều kiện cho 'android: Tự động liên kết = "web" 'cho TextView và không gắn LinkMovement? Tôi nghĩ rằng nên làm việc. – Slartibartfast

+0

Unfortunatelly không hoạt động. Các liên kết của tôi không thể nhấp được theo cách đó. – Simon

+0

Bạn có thể đính kèm ảnh chụp màn hình không, tôi thấy khó hiển thị bố cục và tại sao bạn có hai sự kiện được đính kèm, có không gian trống ở đâu đó trong TV và đó là nơi bạn cần Phương pháp B không? – Slartibartfast

Trả lời

5

Bạn có thể thử thay đổi các OnClickListener như đề cập ở đây: Control onclicklistener in autolink enabled textview

texttv.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
          if(texttv.getSelectionStart()==-1&&texttv.getSelectionEnd()==-1){ 

         // Method B 

          } 

        } 
       }); 

Về cơ bản kiểm tra ở đâu và khi liên kết bắt đầu và kết thúc và chỉ khi bạn arent trên hyperlink bạn muốn, sau đó gọi phương pháp của bạn B, nếu không nó anyway bắn A trên các liên kết Nhưng đây chỉ là một workaround Tôi đoán

Documents đây : http://developer.android.com/reference/android/text/Selection.html#getSelectionEnd(java.lang.CharSequence)

+1

cũng không hoạt động. Phương thức B không được gọi khi nhấp vào chế độ xem văn bản – Simon

+0

xem xét điều này nếu nó không hoạt động http://stackoverflow.com/a/41603171/5873832 –

0

Sau khi nghiên cứu mã nguồn, tôi đã kết luận rằng không có cách nào tốt để làm điều này, nhưng có lẽ lựa chọn tốt nhất của bạn là phương pháp di chuyển tùy chỉnh. Một cái gì đó như thế này:

class MyMovementMethod extends LinkMovementMethod { 

    // Most of this code copied from LinkMovementMethod 
    @Override 
    public boolean onTouchEvent(TextView widget, Spannable buffer, 
           MotionEvent event) { 
     int action = event.getAction(); 

     if (action == MotionEvent.ACTION_UP || 
      action == MotionEvent.ACTION_DOWN) { 
      int x = (int) event.getX(); 
      int y = (int) event.getY(); 

      x -= widget.getTotalPaddingLeft(); 
      y -= widget.getTotalPaddingTop(); 

      x += widget.getScrollX(); 
      y += widget.getScrollY(); 

      Layout layout = widget.getLayout(); 
      int line = layout.getLineForVertical(y); 
      int off = layout.getOffsetForHorizontal(line, x); 

      ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); 

      if (link.length != 0) { 
       if (action == MotionEvent.ACTION_UP) { 
        link[0].onClick(widget); 
       } else if (action == MotionEvent.ACTION_DOWN) { 
        Selection.setSelection(buffer, 
             buffer.getSpanStart(link[0]), 
             buffer.getSpanEnd(link[0])); 
       } 
       return true; 
      } else { 
       Selection.removeSelection(buffer); 
       // NEW CODE - call method B 
       B(); 
      } 
     } 

     return Touch.onTouchEvent(widget, buffer, event); 
    } 

} 

Sau đó, thay vì gọi LinkMovementMethod.getInstance(), tạo một MyMovementMethod để thay thế.

8

Tôi thực hiện việc hack cho bạn, hãy thử mã này!

GIẢI THÍCH:

1.use tùy chỉnh ClickableSpan để xử lý nhấp vào url.

2.clickablespan sẽ xử lý sự kiện nhấp chuột trước chế độ xem văn bản, tạo cờ khi liên kết được nhấp.

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

    TextView textView = (TextView) findViewById(R.id.main_text); 
    textView.setMovementMethod(LinkMovementMethod.getInstance()); 

    CharSequence charSequence = textView.getText(); 
    SpannableStringBuilder sp = new SpannableStringBuilder(charSequence); 

    URLSpan[] spans = sp.getSpans(0, charSequence.length(), URLSpan.class); 

    for (URLSpan urlSpan : spans) { 
     MySpan mySpan = new MySpan(urlSpan.getURL()); 
     sp.setSpan(mySpan, sp.getSpanStart(urlSpan), 
       sp.getSpanEnd(urlSpan), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 
    } 

    textView.setText(sp); 

    textView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // 2.if clicking a link 
      if (!isClickingLink) { 
       Log.w("log", "not clicking link"); 
      } 
      isClickingLink = false; 
     } 
    }); 
} 


private boolean isClickingLink = false; 

private class MySpan extends ClickableSpan { 

    private String mUrl; 

    public MySpan(String url) { 

     super(); 
     mUrl = url; 
    } 

    @Override 
    public void onClick(View widget) { 

     isClickingLink = true; 
     // 1. do url click 
    } 

} 
+0

Làm việc như một sự quyến rũ. Cảm ơn! Tôi sẽ chỉ thêm rằng tôi có android: autoLink = "web | điện thoại | email" trong xml TextView của tôi và trong MySpan onClick tôi đã phải thêm một ý định để đi đến url. –

+0

Cảm ơn rất nhiều điều này đã làm việc cho tôi – Pruthviraj

+0

Tôi đã thử điều này và tôi nhận được lỗi: "URLSpan: Actvity đã không được tìm thấy cho ý định". – trans

0

ghi mã này trong ClickableSpan

ClicableSpan.onClick(View v){ 
    yourTextView.setOnClickListener(null); 
    /* do your own click 
    */ 
    yourTextView.setOnClickListener(your listener); 
} 
Các vấn đề liên quan