2013-07-20 19 views
6

Ich habe eine Textansicht mit einer HTML-Zeichenfolge mit Ankern darin. Wenn ich auf die Textansicht klicke, möchte ich zB eine Methode namens A aufrufen, und wenn ich einen Link in der Textansicht anklicke, möchte ich eine Methode namens B aufrufen. Ich habe das funktioniert, aber ich habe ein Problem: wenn ich auf einen Link klicke, Methode B wird aufgerufen, aber auch Methode A wird aufgerufen. Wie kann ich sicherstellen, dass nur Methode B und nicht B und A aufgerufen wird, wenn ich auf einen Link klicke?Textansicht onclicklistener mit Links

Mein Code:

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

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

     } 
    }); 

Vielen Dank im Voraus, Simon

+0

Haben Sie versucht, so dass 'android: Autolink = "web"' für die Textview und nicht die LinkMovement befestigen? Ich denke, das sollte funktionieren. – Slartibartfast

+0

Leider funktioniert das nicht. Meine Links sind auf diese Weise nicht anklickbar. – Simon

+0

Können Sie einen Screenshot anhängen, ich finde es schwierig, das Layout zu visualisieren und warum haben Sie zwei Ereignisse beigefügt, gibt es leeren Platz an anderer Stelle im TV und das ist, wo Sie Methode B brauchen? – Slartibartfast

Antwort

5

Sie versuchen, die OnClickListener wie hier erwähnt zu modifizieren könnte: 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 

          } 

        } 
       }); 

Grundsätzlich prüfen, wo und wann Links beginnen und enden und nur, wenn Sie über den Hyperlink Arent, dann Ihre Methode B nennen, sonst sowieso es A auf den Links feuert Aber das ist nur eine Abhilfe, die ich

Docs hier erraten : http://developer.android.com/reference/android/text/Selection.html#getSelectionEnd(java.lang.CharSequence)

+1

funktioniert auch nicht. Methode B wird nicht aufgerufen, wenn Sie auf die Textansicht klicken – Simon

+0

Blick auf das, wenn es nicht funktioniert http://Stackoverflow.com/a/41603171/5873832 –

0

Nach dem Studium des Quellcodes, habe ich festgestellt, dass es keine gute Möglichkeit, dies zu tun, aber wahrscheinlich ist Ihre beste Wahl eine benutzerdefinierte Bewegung Methode. Etwas wie folgt aus:

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

} 

Dann statt LinkMovementMethod.getInstance() aufzurufen, erstellen Sie eine MyMovementMethod statt.

8

Ich mache den Hack für Sie, versuchen Sie diesen Code!

ERKLÄRUNG:

1.use ClickableSpan angepasst klicken Sie auf URL zu behandeln.

2.clickablespan behandelt das Klickereignis vor der Textansicht, macht eine Markierung, wenn auf eine Verknüpfung geklickt wird.

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

Arbeitete wie ein Charme. Vielen Dank! Ich füge einfach hinzu, dass ich android habe: autoLink = "web | phone | email" in meinem TextView xml und in MySpan onClick musste ich eine Absicht hinzufügen, um zur URL zu gehen. –

+0

Vielen Dank, das hat für mich funktioniert – Pruthviraj

+0

Ich habe das versucht und bekomme Fehler: "URLSpan: Actvity wurde nicht für die Absicht gefunden". – trans

0

schreiben Dieser Code in ClickableSpan

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