Android 在文本视图中处理多个ClickableSpan
这个问题我已经解决很久了。我得到的是一个简单的字符串Android 在文本视图中处理多个ClickableSpan,android,textview,Android,Textview,这个问题我已经解决很久了。我得到的是一个简单的字符串“这是一个链接,这是另一个链接”。我想让两个“链接”字都可以点击,在浏览器中打开不同的URL 我能做的最简单的方法是在两个“链接”上设置可点击的范围 具有不同URL的单词,但我面临的问题是找到 跨度的起点和终点位置。文本是动态的,我有 以编程方式查找位置 一种方法是找到这个词的第一次出现 “链接”,找到起始和结束位置并设置跨度,然后 第二次发生。但这并不可靠。文本可能包含 不止一种重复的单词,如“这是一个cat链接和 这是另一个cat链接“。
“这是一个链接,这是另一个链接”
。我想让两个“链接”字都可以点击,在浏览器中打开不同的URL
- 我能做的最简单的方法是在两个“链接”上设置可点击的范围 具有不同URL的单词,但我面临的问题是找到 跨度的起点和终点位置。文本是动态的,我有 以编程方式查找位置
- 一种方法是找到这个词的第一次出现
“链接”,找到起始和结束位置并设置跨度,然后
第二次发生。但这并不可靠。文本可能包含
不止一种重复的单词,如
。在这里,我必须链接“cat”和“link” 通过可点击的跨距使用不同URL的单词。我该怎么做呢“这是一个cat链接和 这是另一个cat链接“
- 如果您无法通过编程方式找到链接中的差异,那么您就不能指望其他任何东西能够做到这一点。作为开发人员,您需要一个系统
您需要能够识别可单击的范围-由于链接是唯一的,因此标识它们的文本也必须是唯一的。这很可能是您的用户的问题
您可以获得一个有序的URL列表,如果链接无法区分,只需按照您收到的顺序使用它们。或者,您需要更改创建链接的规则或它们的显示顺序。一种简单的方法是在链接前面包含一个标识符,比如说
/*/
,然后使用该方法查找链接的开始和结束位置。一旦你有了它,首先用一个“
替换标识符,然后点击离开。试着用这种方式
String s="Cat link 1 Cat link 2 Cat link 3";
SpannableString ss = new SpannableString(s);
String first ="Cat link 1";
String second ="Cat link 2";
String third ="Cat link 3";
int firstIndex = s.toString().indexOf(first);
int secondIndex = s.toString().indexOf(second);
ClickableSpan firstwordClick = new ClickableSpan() {
@Override
public void onClick(View widget) {
///............
}
};
ClickableSpan secondwordClick = new ClickableSpan() {
@Override
public void onClick(View widget) {
///............
}
};
ss.setSpan(firstwordClick,firstIndex, firstIndex+first.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(secondwordClick,secondIndex, secondIndex+second.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setLinksClickable(true);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(ss,BufferType.SPANNABLE);
我有这样的字符串“您用orderId订购的{b1j2gh4b}已被bla bla sotre用电话号码(1234124124)认领” 我使用这些大括号是为了找出orderID和电话号码的索引
String notificationMessage = mArrListNotification.get(position).getMessage();
boolean isPhoneNumberAvailable = false, isOrderIdAvailable = false;
int phoneStartIndex = 0, phoneEndIndex = 0, orderIdStartIndex = 0, orderIdEndIndex = 0;
//getting index on the basis of braces added to text
if (notificationMessage.contains("(")) {
isPhoneNumberAvailable = true;
phoneStartIndex = notificationMessage.indexOf("(");
phoneEndIndex = notificationMessage.indexOf(")");
}
if (notificationMessage.contains("{")) {
orderIdStartIndex = notificationMessage.indexOf("{");
orderIdEndIndex = notificationMessage.indexOf("}");
}
// we got the index so remove braces
notificationMessage = notificationMessage.replace("(", " ");
notificationMessage = notificationMessage.replace(")", " ");
notificationMessage = notificationMessage.replace("{", " ");
notificationMessage = notificationMessage.replace("}", " ");
viewHolder.txtNotificationMessage.setText(notificationMessage, TextView.BufferType.SPANNABLE);
Spannable mySpannablePhoneNumber = (Spannable) viewHolder.txtNotificationMessage.getText();
Spannable mySpannableOrderID = (Spannable) viewHolder.txtNotificationMessage.getText();
ClickableSpan mySpanPhoneClick = new ClickableSpan() {
@Override
public void onClick(View widget) {
currentPosition = (Integer) widget.getTag();
String message = mArrListNotification.get(currentPosition).getMessage();
int startIndex = message.indexOf("(");
int endIndex = message.indexOf(")");
phoneNumber = message.substring(startIndex + 1, endIndex);
Log.i("Phone Number", phoneNumber clicked)
}
};
ClickableSpan mySpanOrderClick = new ClickableSpan() {
@Override
public void onClick(View widget) {
currentPosition = (Integer) widget.getTag();
String message = mArrListNotification.get(currentPosition).getMessage();
int startIndex = message.indexOf("{");
int endIndex = message.indexOf("}");
String orderID = message.substring(startIndex + 1, endIndex);
// Log.i("Order id", orderID clicked)
}
};
if (isPhoneNumberAvailable) {
mySpannablePhoneNumber.setSpan(mySpanPhoneClick, phoneStartIndex + 1, phoneEndIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (isOrderIdAvailable) {
mySpannableOrderID.setSpan(mySpanOrderClick, orderIdStartIndex + 1, orderIdEndIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
谢谢你的评论!我明白你的意思了。但是从服务器端提供这种数据,如果可能的话,我也必须处理这种情况。如果标识链接的文本相同怎么办?必须有一种方法为两个文本提供不同的URL。如果文本相同,如何将哪个URL与每个字符串关联?您必须有一个系统才能做出正确的决定?请对这个系统执行相同的操作,String s=“first second third”。字符串可能包含多个重复的单词,我必须链接这些单词。谢谢这你也可以做你自己,加上一些努力从你的结束了。让我知道如果在ITA中遇到困难,正如我所说,文本是动态的。它可能包含一种以上的重复单词。我面临的问题是找到重复单词的开始和结束索引,我必须使用不同的链接进行链接。假设文本中包含了5次“cat”和7次“link”,我必须用不同的URL为每个文本设置可点击的范围。indexOf返回第一个事件,但是其他的呢?我可以得到这个单词在字符串中的第n次出现,但是我很难跟踪它们。我希望你能理解这里的情况@FahimI不想链接“Cat链路1”或“Cat链路2”。我想分别链接它们,“Cat”和“Link”,以及它们的所有事件。如果我不能向你解释情况,我很抱歉。你仍然没有明白我想说的话。无论如何,谢谢:)你能再解释一下你的意思吗?所以说你的文本是“这是一个猫链接,这是另一个猫链接”,而不是发送一个链接“这是一个猫/*/链接,这是另一个猫/*/链接”,作为设置可点击点的标记。。然后检测此标记的位置,以获取可单击文本区域的开始和结束位置。一旦检测到simpley,请移除标记