The*_*n68 1 html android position tooltip clickable
好.这些是我的问题.
从"(标签打开)t(关闭)(标签打开)h(关闭)(标签打开)i(关闭)(标签打开)s(关闭)(标签打开)i(a关闭)(标签打开)s(关闭)(标签打开)w(关闭)(标签打开)r(关闭)(标签打开)o(关闭)(标签打开)n(a关闭)(标签打开)g(关闭)";
至 :
"(标签打开)此(关闭)(标签打开)是(关闭)(标签打开)右(关闭)";
然后我让它们可点击,我需要抓住点击事件并在点击的单词上获得屏幕上的位置,因为我想使用点击的事件使工具提示显示在点击的单词下方.谢谢您的帮助.
公共类MainActivity扩展Activity {
public String text = "This is just a sentence to test you. 23 this is another number23!g?";
public TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = explode(text);
tv = (TextView) findViewById(R.id.tv1);
tv.setLinksClickable(true);
tv.setMovementMethod(LinkMovementMethod.getInstance());
Spanned article = Html.fromHtml(text, null, null);
setHTML(article);
}
public void setHTML(Spanned html) {
SpannableString message = new SpannableString(html.toString());
Object[] spans = html.getSpans(0, html.length(), Object.class);
for (Object span : spans) {
int start = html.getSpanStart(span);
int end = html.getSpanEnd(span);
int flags = html.getSpanFlags(span);
if (span instanceof URLSpan) {
URLSpan urlSpan = (URLSpan) span;
span = new CallbackSpan(urlSpan.getURL());
}
message.setSpan(span, start, end, flags);
}
tv.setText(message);
}
public String explode(String str){
String pattern = "([a-zA-Z])";
str = str.replaceAll(pattern, "<a href=\"$0\">$0</a>");
return str;
}
private final class CallbackSpan extends ClickableSpan {
private String m_data;
private String url_main;
public CallbackSpan(String url) {
m_data = url.substring(0);
url_main = url;
}
public void onClick(View view) {
TextView item = (TextView)findViewById(R.id.tv2);
item.setText(url_main + " was clicked.");
Log.d("item", url_main);
}
}
Run Code Online (Sandbox Code Playgroud)
}
最新代码,请参阅链接表单github
Run Code Online (Sandbox Code Playgroud)message.setSpan(span, start, end, flags);
在设置新范围之前,您需要删除原始范围.请看下面
ClickableSpan的onClick()不适用于URLSpan?
编辑
您可以捕获任何跨度点击事件由extends LinkMovementMethod
import android.os.Handler;
import android.os.Message;
import android.text.Layout;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.TextView;
import java.lang.ref.WeakReference;
public class LinkMovementMethodExt extends LinkMovementMethod {
public static final int LinkMovementMethod_Down = 1001;
public static final int LinkMovementMethod_Up = 2002;
private static LinkMovementMethod sInstance;
private Class mSpanClass = null;
private WeakReference<Handler> mWeakReference = null;
public static MovementMethod getInstance(Handler handler, Class spanClass) {
if (sInstance == null) {
sInstance = new LinkMovementMethodExt();
((LinkMovementMethodExt) sInstance).mWeakReference = new WeakReference<>(handler);
((LinkMovementMethodExt) sInstance).mSpanClass = spanClass;
}
return sInstance;
}
@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);
/**
* get you interest span
*/
Object[] spans = buffer.getSpans(off, off, mSpanClass);
if (spans.length != 0) {
if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer, buffer.getSpanStart(spans[0]), buffer.getSpanEnd(spans[0]));
MessageSpan obj = new MessageSpan();
obj.setObj(spans);
obj.setView(widget);
Handler handler = mWeakReference.get();
if (handler != null) {
Message message = handler.obtainMessage();
message.obj = obj;
message.what = LinkMovementMethod_Down;
message.sendToTarget();
return true;
}
return false;
} else if (action == MotionEvent.ACTION_UP) {
Handler handler = mWeakReference.get();
if (handler != null) {
MessageSpan obj = new MessageSpan();
obj.setView(widget);
Message message = handler.obtainMessage();
message.obj = obj;
message.what = LinkMovementMethod_Up;
message.sendToTarget();
return true;
}
return false;
}
}
}
return super.onTouchEvent(widget, buffer, event);
}
public boolean canSelectArbitrarily() {
return true;
}
public boolean onKeyUp(TextView widget, Spannable buffer, int keyCode,
KeyEvent event) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
textView.setMovementMethod(LinkMovementMethodExt.getInstance());
编辑"android developer"
这是为LinkMovementMethodExt类添加Handler属性的更好方法.
您可以捕获作为Message对象传递的所有Spanned.
onTouchEvent方法中的剪辑代码:
Message message = Handler.obtainMessage();
message.obj = buffer.getSpans(off, off, Spanned.class);//get all spanned
message.what = 111;//which value ,it is up to you
message.sendToTarget(); //send message to you target handler
Run Code Online (Sandbox Code Playgroud)
您可以在处理程序类中处理预期的跨区域.可能是灵活的处理方式.
希望能帮到你.

在textview文本上面<a href='/a'>aaaa</a>123456<a href='/b'>bbbb</b>7890
我理解你的要求:
点击'aaaa',你想得到它s href value '/a', click 'bbbb',get ithref'/ b'; 不要触发在Web浏览器中打开的默认操作.
如果我理解是对的,你可以这样做:
textview.setMovementMethod(LinkMovementMethodExt.getInstance(handler, URLSpan.class));Run Code Online (Sandbox Code Playgroud)private Handler handler = new Handler() { public void handleMessage(Message msg) { int what = msg.what; if (what == 100) { Object[] spans = (Object[])msg.obj; for (Object span : spans) { if (span instanceof URLSpan) { System.out.println(((URLSpan) span).getURL()); } } } }; };
怎么做?
Step1,获取当前点击范围.
Step2,为当前点击范围设置BackgroundColorSpan
| 归档时间: |
|
| 查看次数: |
7390 次 |
| 最近记录: |