【问题标题】:Change color of string xml hiperlink without overriding style在不覆盖样式的情况下更改字符串 xml hiperlink 的颜色
【发布时间】:2019-06-18 11:38:46
【问题描述】:

我正在开发一个 android 应用程序,我想知道如何更改 XML 字符串中特定链接的颜色。

这在 strings_example.xml 中

<string name="hello_there">Hello There!<a href="tel:XXXXXXXXX" color="#8ABD37>More info!</a></string>

这是我的活动布局

<TextView
    somecode
    android:text="@strings/hello_there"
    style="@styles/whatever"/>

那么,如何在不覆盖 xml 字符串中的颜色的情况下应用“任何样式”?

另外:我不能将样式放在 xml 字符串中,我必须从 TextView 设置样式

【问题讨论】:

    标签: java android xml


    【解决方案1】:

    您可以使用如下所示的 Html 样式属性

    在您的string.xml 中使用&lt;![CDATA[ ...raw html... ]]&gt;

    <string name="formated_string"><![CDATA[ <p Hello there <b>More info</b> and <i>Here</i </p>]]> </string>
    

    在你的 java 类中

    TextView myTv = (TextView)findViewById(R.id.foo);
    myTv.setText(Html.fromHtml(getString(R.string.formated_string)));
    

    您可以根据需要添加自定义html样式

    【讨论】:

    • 感谢您的评论!但我对此表示严重怀疑,@vipul-prajapati 如果你这样做:myTv.setTextAppareance(...) 我相信你会覆盖你的 Html 字符串。是吗?
    • @DavidFernándezEsteban 我没有在我的解决方案中使用setTextAppareance(...) ,这种方法也已从 API 23 中删除。
    【解决方案2】:

    在 android 中有两种方式来设置文本样式:

    1- 您可以使用 SpannableString 并将您的文本分成多个部分,如下所示:

    val spannable = SpannableString("Sample Text.......")
    spannable.setSpan(ForegroundColorSpan(Color.RED), 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    myTextView.text = spannable
    

    2- 或者你可以用这种方式在你的 textview 中渲染 html:

    textView.setText(Html.fromHtml(
        "Hello There!<a href=\"tel:XXXXXXXXX\" color=\"#8ABD37\">More info!</a>"));
    

    //或

    textView.setText(Html.fromHtml(getResources().getString(R.string.hello_there)));
    

    【讨论】:

    • 感谢您的回复!但是,我正在寻找一种将 Texview 的样式与字符串 xml 的 Html 颜色相结合的方法
    • 第二种方法是你想要的。您可以将html代码直接放在您的textview中,它将以正确的方式呈现。
    【解决方案3】:

    我已经疯狂了一个有点复杂的解决方案。我正在用自定义替换当前的URLSpan

    TextView textView = findViewById(R.id.textView);
    
    // Make the link to be clickable
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    
    // Url link
    Spanned text = Html.fromHtml(getString(R.string.hello_there));
    
    // We search for the first occurrence of URLSpanand we replace it with custom one
    SpannableStringBuilder spannable = new SpannableStringBuilder(text);
    Object[] spans = spannable.getSpans(0, spannable.length(), Object.class);
    for (Object span : spans) {
        if (span instanceof URLSpan) {
            int spanStart = spannable.getSpanStart(span);
            int spanEnd = spannable.getSpanEnd(span);
            int spanFlags = spannable.getSpanFlags(span);
    
            URLSpan spanUrlBase = (URLSpan) span;
            MyUrlSpan myUrlSpan = new MyUrlSpan(spanUrlBase.getURL());
    
            spannable.setSpan(myUrlSpan, spanStart, spanEnd, spanFlags);
            break;
        }
    }
    
    textView.setText(spannable);
    

    --

    private class MyUrlSpan extends URLSpan {
    
        public MyUrlSpan(String url) {
            super(url);
        }
    
        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setColor(Color.GREEN);
        }
    }
    

    --

    Xml 不能识别所有特殊字符。我必须将&lt; 解码为正确的声明。

    <string name="hello_there">&lt;a color="#8ABD37" href="tel:XXXXXXXXX">More info!&lt;/a></string>
    

    更多信息here

    【讨论】:

      【解决方案4】:

      我讨厌回答自己。这是最好的方法:

      <style name="generic_body_style_with_links" parent="generic_body_style">
              <item name="android:textColorLink">@color/green_400</item>
      </style>
      

      这样,您可以在 generic_body_style 中将常规文本的颜色设置为黑色,例如,您可以将&lt;a href =""..../&gt; 的颜色设置为绿色。全部在同一个 TextView 中,无需拆分。

      其他类似的东西很有用,但在这种情况下你不能应用它,因为你用 TextView 样式的默认颜色覆盖了这个颜色。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-20
        相关资源
        最近更新 更多