Android 上 TextView 中的多个可点击链接

2022-09-01 09:08:47

我正在尝试在文本视图中添加多个链接,类似于Google&Flipboard在下面所做的,他们的条款和条件以及隐私政策显示在下面的屏幕截图中:

到目前为止,我偶然发现了这种方法

textView.setText(Html.fromHtml(myHtml); textView.setMovementMethod(LinkMovementMethod.getInstance());

其中 myHtml 是一个 href。

但它不能让我控制我需要的,例如发射一个片段等。

他们知道如何在下面的两个例子中实现这一点吗?

Flipboard terms and conditions view

Google terms and conditions view


答案 1

我认为我分享这个有点晚了,但我使用SpantableStringBuilder也实现了同样的目标。

只需初始化要添加 2 个或更多侦听器的 ,然后将其传递给我创建的以下方法:TextView

private void customTextView(TextView view) {
        SpannableStringBuilder spanTxt = new SpannableStringBuilder(
                "I agree to the ");
        spanTxt.append("Term of services");
        spanTxt.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                Toast.makeText(getApplicationContext(), "Terms of services Clicked",
                        Toast.LENGTH_SHORT).show();
            }
        }, spanTxt.length() - "Term of services".length(), spanTxt.length(), 0);
        spanTxt.append(" and");
        spanTxt.setSpan(new ForegroundColorSpan(Color.BLACK), 32, spanTxt.length(), 0);
        spanTxt.append(" Privacy Policy");
        spanTxt.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                Toast.makeText(getApplicationContext(), "Privacy Policy Clicked",
                        Toast.LENGTH_SHORT).show();
            }
        }, spanTxt.length() - " Privacy Policy".length(), spanTxt.length(), 0);
        view.setMovementMethod(LinkMovementMethod.getInstance());
        view.setText(spanTxt, BufferType.SPANNABLE);
    } 

在 XML 中,用于添加您选择的自定义链接颜色。喜欢这个:android:textColorLink

   <TextView
     android:id="@+id/textView1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="TextView"
     android:textColorLink="#C36241" />  //#C36241 - Rust

这看起来像这样:

enter image description here

希望它能帮助别人。:)


答案 2

您可以使用Linkifyandroid.text.Spannablejava.util.regex.Patternjava.lang.String)

String termsAndConditions = getResources().getString(R.string.terms_and_conditions);
String privacyPolicy = getResources().getString(R.string.privacy_policy);

legalDescription.setText(
    String.format(
        getResources().getString(R.string.message),
        termsAndConditions,
        privacyPolicy)
);
legalDescription.setMovementMethod(LinkMovementMethod.getInstance());

Pattern termsAndConditionsMatcher = Pattern.compile(termsAndConditions);
Linkify.addLinks(legalDescription, termsAndConditionsMatcher, "terms:");

Pattern privacyPolicyMatcher = Pattern.compile(privacyPolicy);
Linkify.addLinks(legalDescription, privacyPolicyMatcher, "privacy:");

然后,您可以使用该方案启动活动,例如通过在 AndroidManifest 中添加该方案:

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="terms" />
    <data android:scheme="privacy" />
</intent-filter>

如果要执行自定义操作,可以将意向过滤器设置为当前活动,该活动将具有单个Top启动模式。

这将导致onNewIntent被触发,可以进行自定义操作:

@Override
protected void onNewIntent(final Intent intent) {
 ...
  if (intent.getScheme().equals(..)) {
    ..
  }
}

推荐