hyperlink - 一个TextView 如何使用可单击的链接?

  显示原文与译文双语对照的内容

我定义了以下 TextView:


<TextView android:layout_width="wrap_content"
 android:layout_height="wrap_content" android:text="@string/txtCredits"
 android:autoLink="web" android:id="@+id/infoTxtCredits"
 android:layout_centerInParent="true"
 android:linksClickable="true"></TextView>

其中 @string/txtCredits 是包含字符串资源 <a href="some site">Link text</a>

Android正在突出显示TextView中的链接,但没有响应点击。 谁能告诉我什么是错误的? 在我的Activity 中,是否必须为TextView设置一个名称,以便像这样简单?

看起来它与我定义字符串资源的方式有关。 这不能工作:


<string name="txtCredits"><a href="http://www.google.com">Google</a></string>

但是这样做:


<string name="txtCredits">www.google.com</string>

这是个错误,因为我宁愿显示一个文本链接,而不是显示完整的URL 。

时间:

在API演示中,我找到了解决我的问题的解决方案:

Link.java:


//text2 has links specified by putting <a> tags in the string
//resource. By default these links will appear but not
//respond to user input. To make them active, you need to
//call setMovementMethod() on the TextView object.

 TextView t2 = (TextView) findViewById(R.id.text2);
 t2.setMovementMethod(LinkMovementMethod.getInstance());

我删除了TextView上的大多数属性以匹配演示中的内容。


<TextView
 android:id="@+id/text2"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_below="@+id/imgCredits"
 android:layout_centerInParent="true"
 android:layout_marginTop="20dp"
 android:text="@string/txtCredits"/>

解决了它。很难发现和修复。

我只使用 android:autoLink="web",它工作正常。 点击链接打开浏览器并显示正确的页面。

我可以猜测的一点是,其他视图位于链接之上。 透明填充整个父对象,但在链接之上不显示任何内容。 在这种情况下,点击到这个视图而不是链接。

上面的解决方案对我不起作用,但以下是( 看起来有点干净) 。
首先,在字符串资源中,使用HTML实体编码 i.e.:


&lt;a href="http://www.google.com">Google&lt;/a>

而不是:


<a href="http://www.google.com">Google</a>

通常,对字符串中的所有符号进行编码,例如。 顺便说一下,链接必须以 http:// 开头

然后( 就像建议的这里 ) 在你的TextView上设置这里选项:


 android:linksClickable="true"

最后,在代码中,执行以下操作:


((TextView) findViewById(R.id.your_text_view)).setMovementMethod(LinkMovementMethod.getInstance());
((TextView) findViewById(R.id.your_text_view)).setText(Html.fromHtml(getResources().getString(R.string.string_with_links)));

就是这样,不需要正则表达式或者其他手工攻击。

在花了一些时间之后,我发现:

  • 如果你的HTML中有完整的链接,android:autoLink="web" 可以工作。 以下将以蓝色和可以点击的方式显示:
  • 一些文本 <a href="http://www.google.com">http://www.google.com</a>
  • 某些文本 http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance()); 将使用以下( 将被高亮显示并单击):
  • 一些文本 <a href="http://www.google.com">http://www.google.com</a>
  • 某些文本 http://www.google.com
  • 一些文本 <a href="http://www.google.com">Go to Google</a>

注意第三个选项有一个超链接,但链接( 标记之间的部分) 本身的描述不是链接。 android:autoLink="web"处理这样的联系。

  • android:autoLink="web" 如果在XML中设置将覆盖 view.setMovementMethod(LinkMovementMethod.getInstance()); ( 换句话说,;第三个种类的链接将被突出显示,但不能点击) 。

故事的寓意是使用 view.setMovementMethod(LinkMovementMethod.getInstance()); 在你的代码中并确保你的XML布局中没有 android:autoLink="web",如果你希望所有链接都可以点击。

如果你想要添加HTML-like链接,你所需要做的就是:

  • 添加资源HTML-like字符串:

    
     <string name="link"><a href="https://www.google.pl/">Google</a></string>
    
    
  • 将视图添加到没有link-specific配置的布局中:

    
     <TextView
     android:id="@+id/link"
     android:text="@string/link"/>`
    
    
  • 以编程方式向TextView添加适当的MovementMethod:

    
     mLink = (TextView) findViewById(R.id.link);
     if (mLink!= null) {
     mLink.setMovementMethod(LinkMovementMethod.getInstance());
     }
    
    

这就是它是的,在显式链接选项"autolink"和"linksClickable"工作只有( 未被包装到html标签中) 非常误导我。。!

你只需要在xml中的文本视图中添加这里内容


<TextView
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:autoLink="web"/>

所有测试和工作 100%
解决方案:android: autolink="站点"
下面是一个完整的示例

示例布局 Xml


 <TextView
 android:id="@+id/txtLostpassword"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"
 android:autoLink="email"
 android:gravity="center"
 android:padding="20px"
 android:text="@string/lostpassword"
 android:textAppearance="?android:attr/textAppearanceSmall"/>

 <TextView
 android:id="@+id/txtDefaultpassword"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"
 android:autoLink="web"
 android:gravity="center"
 android:padding="20px"
 android:text="@string/defaultpassword"
 android:textAppearance="?android:attr/textAppearanceSmall"/>

string.xml 中的字符串


<string name="lostpassword">If you lost your password please contact <a href="mailto:support@cleverfinger.com.au?Subject=Lost%20Password" target="_top">support@cleverfinger.com.au</a></string>

<string name="defaultpassword">User Guide <a href="http://www.cleverfinger.com.au/user-guide/">http://www.cleverfinger.com.au/user-guide/</a></string>

下一次,你应该在布局XML的TextView下添加这里代码。


android:autoLink="all"

这应该是这样的。


<TextView 
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" 
 android:text="@string/txtCredits"
 android:id="@+id/infoTxtCredits"
 android:autoLink="all"
 android:linksClickable="true">
</TextView>

你不需要使用这里代码( t2.setMovementMethod(LinkMovementMethod.getInstance()); ) 以使链接可以点击。

也,这是真理:只要你设置 autoLink和 linksClickable,不要忘记添加在 String.xml 文件,点击链接工作。


<string name="txtCredits"><a href="http://www.google.com">Google</a></string>

我希望这将帮助你;


String value ="<html>Visit my blog <a href="http://www.maxartists.com">mysite</a> View <a href="sherif-activity://myactivity?author=sherif&nick=king">myactivity</a> callback</html>";
 TextView text = (TextView) findViewById(R.id.text);


 text.setText(Html.fromHtml(value));
 text.setMovementMethod(LinkMovementMethod.getInstance());

我用了这个简单


Linkify.addLinks(TextView, Linkify.ALL);

使链接可以单击这里

...