Android 在文本视图中处理多个ClickableSpan

Android 在文本视图中处理多个ClickableSpan,android,textview,Android,Textview,这个问题我已经解决很久了。我得到的是一个简单的字符串“这是一个链接,这是另一个链接”。我想让两个“链接”字都可以点击,在浏览器中打开不同的URL 我能做的最简单的方法是在两个“链接”上设置可点击的范围 具有不同URL的单词,但我面临的问题是找到 跨度的起点和终点位置。文本是动态的,我有 以编程方式查找位置 一种方法是找到这个词的第一次出现 “链接”,找到起始和结束位置并设置跨度,然后 第二次发生。但这并不可靠。文本可能包含 不止一种重复的单词,如“这是一个cat链接和 这是另一个cat链接“。

这个问题我已经解决很久了。我得到的是一个简单的字符串
“这是一个链接,这是另一个链接”
。我想让两个“链接”字都可以点击,在浏览器中打开不同的URL

  • 我能做的最简单的方法是在两个“链接”上设置可点击的范围 具有不同URL的单词,但我面临的问题是找到 跨度的起点和终点位置。文本是动态的,我有 以编程方式查找位置
  • 一种方法是找到这个词的第一次出现 “链接”,找到起始和结束位置并设置跨度,然后 第二次发生。但这并不可靠。文本可能包含 不止一种重复的单词,如
    “这是一个cat链接和
    这是另一个cat链接“
    。在这里,我必须链接“cat”和“link” 通过可点击的跨距使用不同URL的单词。我该怎么做呢

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

      您需要能够识别可单击的范围-由于链接是唯一的,因此标识它们的文本也必须是唯一的。这很可能是您的用户的问题


      您可以获得一个有序的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,请移除标记