Android TextView Hyperlink

Я реализую TextView со строкой, содержащей две гиперссылки, как показано ниже, но ссылки не открывают новое окно браузера:

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:textColor="#ffffff" android:paddingLeft="50dp" android:paddingRight="50dp" android:textSize="14sp" android:clickable="true" android:linksClickable="true" android:textColorLink="@color/colorPrimary" android:autoLink="web" android:text="@string/agree_terms_privacy"/> 

В string.xml

 <string name="agree_terms_privacy">By continuing, you agree to our <a href="http://link1/terms">Terms of Use</a> and read the <a href="http://link1/privacy">Privacy Policy</a></string> 

Посмотрите ниже фрагмент кода, надейтесь, что это поможет,

 TextView textView =(TextView)findViewById(R.id.textView); textView.setClickable(true); textView.setMovementMethod(LinkMovementMethod.getInstance()); String text = "<a href='http://www.google.com'> Google </a>"; textView.setText(Html.fromHtml(text)); 

Вот решение, которое сработало для меня, просмотрев несколько сообщений о переполнении стека. Я адаптировал его к вашей реализации:

1. Удалите автолинк в пользу использования LinkMovementMethod и установите linksClickable в true

 <TextView android:id="@+id/termsOfUse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:textColor="#ffffff" android:paddingLeft="50dp" android:paddingRight="50dp" android:textSize="14sp" android:clickable="true" android:linksClickable="true" android:textColorLink="@color/colorPrimary" android:text="@string/agree_terms_privacy"/> 

Если вы используете android:autoLink="web" вам придется переопределить его с помощью textView.setAutoLinkMask(0); Перед вызовом setText() в TextView. Вы также можете установить, что ссылка будет отображаться в вашей деятельности, а не в ответе Харшала, если вы предпочитаете, но я оставил ее, так как вы уже имели ее в макете. Я также добавил идентификатор вашего TextView с именем termsOfUse который мы будем использовать позже.

2. Замените <с &lt; В strings.xml и удалите двойные кавычки вокруг URL-адреса

Это связано с тем, что когда вы извлекаете строковый ресурс, он не будет правильно анализировать встроенный html, и по какой-то причине он не избегает двойных кавычек. Поэтому вместо:

 <string name="agree_terms_privacy">By continuing, you agree to our <a href="http://link1/terms">Terms of Use</a> and read the <a href="http://link1/privacy">Privacy Policy</a></string> 

Вы захотите сделать:

 <string name="agree_terms_privacy">By continuing, you agree to our &lt;a href=http://link1/terms>Terms of Use&lt;/a> and read the &lt;a href=http://link1/privacy>Privacy Policy&lt;/a></string> 

3. Разбор текстового ресурса и привязка его к нашему TextView

 Spanned policy = Html.fromHtml(getString(R.string.agree_terms_privacy)); TextView termsOfUse = (TextView)findViewById(R.id.termsOfUse); termsOfUse.setText(policy); termsOfUse.setMovementMethod(LinkMovementMethod.getInstance()); 

Примечание. Html.fromHtml устарел в API 24 (см. Это сообщение для получения дополнительной информации о том, как обращаться с этим при необходимости). Мы используем этот метод для получения ожидаемого форматирования HTML из нашей строки.

Я бы рекомендовал вам иметь два TextViews так как вам нужно два разных действия:

 TextView yourTermsOfUseTextView = (TextView) findViewById(R.id.your_id); yourTermsOfUseTextView.setOnclickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(your_download_link)); startActivity(myIntent); } }); 

Повторите политику конфиденциальности.