我有一个带有锚点的html字符串的textview。当我单击textview时我想调用例如一个名为A的方法,当我单击textview中的一个链接时,我想调用一个名为B的方法。我得到了这个工作但我遇到了一个问题:当我点击一个链接时,方法调用B,但也调用方法A.当我点击链接时,如何确保只调用方法B而不是B和A?
我的代码:
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 :(得分:10)
我为你做了黑客攻击,试试这段代码!
说明:
1.使用自定义的ClickableSpan来处理点击网址。
2.clickablespan将在文本视图之前处理click事件,在单击链接时创建一个标记。
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
}
}
答案 1 :(得分:6)
您可以尝试修改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
}
}
});
基本上检查链接的开始和结束的位置和时间,并且只有当你不在超链接上时,然后调用你的方法B,否则无论如何在链接上触发A 但这只是一种解决方法我猜
答案 2 :(得分: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
。
答案 3 :(得分:0)
在ClickableSpan中编写此代码
ClicableSpan.onClick(View v){
yourTextView.setOnClickListener(null);
/* do your own click
*/
yourTextView.setOnClickListener(your listener);
}