在 textview 上链接,文本中的域不起作用,链接不可点击

Posted

技术标签:

【中文标题】在 textview 上链接,文本中的域不起作用,链接不可点击【英文标题】:linkify on textview with domain in text not working, links not clickable 【发布时间】:2018-10-24 20:10:36 【问题描述】:

当字符串表示域名时,我无法linkfy 带有href 的字符串。所以字符串。让我告诉你。

这是字符串:

<string name="go_to_settings">Please go to "Settings" in <a href="https://www.mywebsite.com/settings">mywebsite.com</a> to change this status</string>

它会对用户说:“请转到 mywebsite.com 中的“设置”以更改此状态。”

这是我正在使用的textview

  <TextView
      android:id="@+id/tv_instructions"
      android:layout_
      android:layout_
      android:layout_marginTop="73dp"
      android:lineSpacingExtra="3sp"
      android:textAlignment="center"
      android:textColor="#5c5c5c"
      android:textColorLink="@color/action_blue"
      android:linksClickable="true"
      android:text="@string/go_to_settings"/>

这就是我尝试建立链接的方法clickable

 Linkify.addLinks(tv_instructions, Linkify.ALL)
 tv_instructions.movementMethod=LinkMovementMethod.getInstance()

但我看到在 api 24 和 27 设备和模拟器上发生的情况是链接将转到 www.mywebsite.com 而不是 www.mywebsite/settings

但奇怪的是,如果我更改用户看到的文本并从中删除 .com,那么它就可以正常工作。因此,如果用户看到它,它会起作用:

它会对用户说:“请转到我的网站中的“设置”以更改此状态。”

注意这里没有提到 .com。我怎样才能得到这个显示。我也试过这种方式:

tv_instructions.text=(utils.fromhtml(resources.getString(R.string.go_to_settings),null))
tv_instructions.movementMethod=LinkMovementMethod.getInstance()

和这样的文本视图:

    <TextView
                       android:id="@+id/tv_instructions"
                       android:layout_
                       android:layout_
                       android:layout_marginTop="73dp"
                       android:lineSpacingExtra="3sp"
                       android:textAlignment="center"
                       android:textColor="#5c5c5c"

                       android:text="@string/go_to_settings"
               />

你们知道我做错了什么吗?

【问题讨论】:

测试用例android:autoLink="web" 我在代码中删除了所有链接中的调用,并按照您在 xml 中所说的进行了操作。结果相同 您是否在浏览器中打开了链接 链接在浏览器中打开正常。 【参考方案1】:

想通了。出于某种原因,我需要在我的strings 文件中使用标签cData 将我的文本包装为字符数据。这行得通:

<string name="go_to_settings"><![CDATA[Please go to "Settings" in <a href="https://www.mywebsite.com/settings">mywebsite.com</a> to change this status :]]></string>

那么textview 看起来像这样:

 <TextView
      android:id="@+id/tv_instructions"
      android:layout_
      android:layout_
      android:layout_marginTop="73dp"
      android:lineSpacingExtra="3sp"
      android:text="@string/go_to_settings"
      android:textAlignment="center"
      android:textColor="#5c5c5c"
      android:textColorLink="@color/action_blue"/>

Java 代码

tv_instructions.text=(utils.fromHTML(resources.getString(R.string.go_to_settings),null))
tv_instructions.movementMethod=LinkMovementMethod.getInstance()

【讨论】:

唯一对我有用的东西。这是。添加 CDATA !!【参考方案2】:

在 textview 上链接,文本中的域不起作用,链接不可点击

你也可以使用ClickableSpan

如果此类型的对象以LinkMovementMethod 的移动方法附加到TextView 的文本,则可以选择受影响的文本范围。如果选中并单击,将调用onClick(View) 方法。

查看下面的示例代码

试试这个

public class MainActivity extends AppCompatActivity 

    TextView myTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myTextView = (TextView) findViewById(R.id.myTextview);

        setSpan();
    

    private void setSpan() 

        SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("Please go to \"Settings\" in");
        SpannableString spannableString = new SpannableString(" mywebsite.com ");

        ClickableSpan clickableSpan = new ClickableSpan() 
            @Override
            public void onClick(View textView) 
                Toast.makeText(MainActivity.this, "Click", Toast.LENGTH_SHORT).show();
                // you can open your link here as per your requiremnt
            
        ;

        spannableString.setSpan(clickableSpan, 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(new UnderlineSpan(), 0, spannableString.length(), 0);

        spannableStringBuilder.append(spannableString);
        spannableStringBuilder.append("to change this status");

        myTextView.setText(spannableStringBuilder);
        myTextView.setMovementMethod(LinkMovementMethod.getInstance());
    



【讨论】:

这也是一个不错的方法但是我不想写代码,+1

以上是关于在 textview 上链接,文本中的域不起作用,链接不可点击的主要内容,如果未能解决你的问题,请参考以下文章

静态 GCS 网站存储桶和 http 根域不起作用

UITableView backgroundview 在文本区域不起作用

文本区域不起作用[重复]

在 WhatsApp 短信上链接地理位置

替换与给定域不匹配的链接中的协议

当内部作用域不起作用时,为啥编译器不采用命名空间名称?