2013-07-20 83 views
6

我有一個帶有錨點的html字符串的textview。當我點擊textview時,我想調用一個名爲A的方法,當我在textview中單擊一個鏈接時,我想調用一個名爲B的方法。我得到了這個工作,但我遇到了一個問題:當我單擊一個鏈接時,方法B被調用,但方法A也被調用。我怎樣才能確保只有方法B,而不是B和A,當我點擊鏈接時被調用?帶有鏈接的Textview onclicklistener

我的代碼:

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()); 

而且TextView的onclicklistener:

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(); 
      } 

     } 
    }); 

由於提前, 西蒙

+0

您是否嘗試過讓'機器人:自動鏈接= 「網絡」 爲'TextView的和不附加LinkMovement?我認爲這應該工作。 – Slartibartfast

+0

不幸的是,這不起作用。我的鏈接不能以這種方式點擊。 – Simon

+0

你可以附上一張截圖嗎,我發現很難想象佈局以及爲什麼附加兩個事件,電視中其他地方是否有空白空間,以及那些你需要的方法B? – Slartibartfast

回答

5

喜歡這裏提到的你可以嘗試修改onClickListener: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 

          } 

        } 
       }); 

基本上檢查何時何環節開始和結束,只有當你的arent在超鏈接,然後打電話給你的方法B,否則無論如何會觸發上的鏈接 但是,這只是一種變通方法我想在這裏

文檔:http://developer.android.com/reference/android/text/Selection.html#getSelectionEnd(java.lang.CharSequence)

+1

也不起作用。當單擊textview時不調用方法B – Simon

+0

看看這個如果它沒有工作http://stackoverflow.com/a/41603171/5873832 –

0

研究完源代碼後,我斷定沒有好的方法來做到這一點,但可能你最好的選擇是自定義移動方法。事情是這樣的:

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); 
    } 

} 

然後,而不是調用LinkMovementMethod.getInstance(),創建MyMovementMethod代替。

8

我爲你做了破解,試試這段代碼吧!

說明:

1.使用定製ClickableSpan處理點擊網址。

2.clickablespan將處理textview之前的點擊事件,並在點擊鏈接時生成一個標誌。

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

工作就像一個魅力。謝謝!我只需在我的TextView xml和MySpan onClick中添加android:autoLink =「web | phone | email」,我不得不添加一個轉到url的意圖。 –

+0

非常感謝這對我有用 – Pruthviraj

+0

我試過這個,我得到錯誤:「URLSpan:Actvity沒有找到意圖」。 – trans

0

寫這段代碼ClickableSpan

ClicableSpan.onClick(View v){ 
    yourTextView.setOnClickListener(null); 
    /* do your own click 
    */ 
    yourTextView.setOnClickListener(your listener); 
}