在TextView中处理多个ClickableSpan

时间:2015-02-18 07:09:40

标签: android textview

我长期坚持这个问题。我所拥有的是一个简单的字符串"This is a link and this is another link"。我希望两个“链接”单词都可以点击,在浏览器中打开不同的URL。

  • 我能做的最简单的方法是在“链接”上设置Click-able Span 不同网址的单词,但我面临的问题是找到 跨度的开始和结束位置。文字是动态的,我有 以编程方式查找职位。
  • 一种方法是找到第一个出现的单词 '链接',找到开始和结束位置并设置跨度,然后 第二次出现。但这不可靠。文字可能包含 不止一种重复的单词,如"This is a cat link and this is another cat link"。在这里,我必须链接“猫”和“链接” 通过Click-able Span获得具有不同URL的单词。我该怎么做呢?

4 个答案:

答案 0 :(得分:7)

以这种方式尝试

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

答案 1 :(得分:0)

如果您无法以编程方式找到链接中的差异,那么您不能指望其他任何东西能够做到这一点。作为开发人员,您需要一个系统。

您需要能够识别可点击的跨度 - 因为链接是唯一的,标识它们的文本也必须是唯一的。这很可能是您的用户的问题。

您可以获得有序的URL列表,然后如果链接无法区分,只需按照您收到的顺序使用它们即可。或者,您需要更改创建链接的规则或它们的显示顺序。

答案 2 :(得分:0)

执行此操作的一种简单方法是在链接前添加标识符/*/,然后使用此标识查找链接的开始和结束位置。完成后,首先使用""替换标识符,然后单击选择。

答案 3 :(得分:0)

我有一些字符串“你订购了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);
            }