【问题标题】:How to click or tap on a TextView text on different words?如何单击或点击不同单词上的 TextView 文本?
【发布时间】:2012-03-06 12:55:53
【问题描述】:

如何通过单击带有两个不同单词的文本视图来移动到另一个视图。 这是我正在使用的字符串。

By clicking Sign Up, you are indicating that you have read and agree to the 
Term of Use and Privacy Policy.

我想让这两个词(使用条款、隐私政策)用不同的颜色和可点击..

我知道如何为特定单词着色。我想让它可以点击。

【问题讨论】:

  • 嗨,如何删除这个“小部件”,并刷新编辑文本。 ssb.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { // 如何移除这个“widget”,并刷新edittext。} }, idx1, idx2, 0);

标签: android textview spannable


【解决方案1】:

我终于弄清楚了如何在 TextView 中有多个可点击的部分。 重要的是他们都有自己的 ClickableSpan!那是我第一次测试时出错的地方。如果它们具有相同的 ClickableSpan 实例,则仅记住最后设置的跨度。

我创建了一个字符串,其中所需的可点击区域被“[”和“]”包围。

String sentence = "this is [part 1] and [here another] and [another one]";

这里是设置的TextView,setMovementMehthod也是强制的:

textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(addClickablePart(sentence), BufferType.SPANNABLE);

我已经创建了这个函数,它将处理可点击区域的创建:

private SpannableStringBuilder addClickablePart(String str) {
    SpannableStringBuilder ssb = new SpannableStringBuilder(str);

    int idx1 = str.indexOf("[");
    int idx2 = 0;
    while (idx1 != -1) {
        idx2 = str.indexOf("]", idx1) + 1;

        final String clickString = str.substring(idx1, idx2);
        ssb.setSpan(new ClickableSpan() {

            @Override
            public void onClick(View widget) {
                Toast.makeText(getView().getContext(), clickString,
                        Toast.LENGTH_SHORT).show();
            }
        }, idx1, idx2, 0);
        idx1 = str.indexOf("[", idx2);
    }

    return ssb;
}

【讨论】:

  • 这很好但是显示的sentence字符串有[],不应该包含在显示的字符串中吗?
  • 如果你愿意,你可以自己决定,只需根据自己的喜好更改来源......
  • 兄弟,这个答案太棒了。你摇滚:-)
  • 我想检查两个标签(@ 和 #),例如 [ ] this 。你能给我任何解决方案吗
  • ssb.setSpan(new ClickableSpan() { 嗨,如何删除这个“小部件”,并刷新edittext。@Override public void onClick(View widget) { // 如何删除这个“小部件” , 并刷新edittext。} }, idx1, idx2, 0);
【解决方案2】:

根据 Boy 的回复(感谢您的回复,这对我有很大帮助),这是我实现它的另一种方法,没有使用内部类来描述可点击单词的 '[' 和 ']' 字符:

import java.util.List;

import android.content.Context;
import android.text.SpannableStringBuilder;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Defines a TextView widget where user can click on different words to see different actions
 *
 */
public class ClickableTextView extends TextView {

    public ClickableTextView(Context context) {
        super(context);
    }

    public ClickableTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ClickableTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setTextWithClickableWords(String text, List<ClickableWord> clickableWords) {
        setMovementMethod(LinkMovementMethod.getInstance());
        setText(addClickablePart(text, clickableWords), BufferType.SPANNABLE);
    }

    private SpannableStringBuilder addClickablePart(String str, List<ClickableWord> clickableWords) {
        SpannableStringBuilder ssb = new SpannableStringBuilder(str);

        for (ClickableWord clickableWord : clickableWords) {
            int idx1 = str.indexOf(clickableWord.getWord());
            int idx2 = 0;
            while (idx1 != -1) {
                idx2 = idx1 + clickableWord.getWord().length();
                ssb.setSpan(clickableWord.getClickableSpan(), idx1, idx2, 0);
                idx1 = str.indexOf(clickableWord.getWord(), idx2);
            }
        }

        return ssb;
    }

    public static class ClickableWord {
        private String word;
        private ClickableSpan clickableSpan;

        public ClickableWord(String word, ClickableSpan clickableSpan) {
            this.word = word;
            this.clickableSpan = clickableSpan;
        }

        /**
         * @return the word
         */
        public String getWord() {
            return word;
        }

        /**
         * @return the clickableSpan
         */
        public ClickableSpan getClickableSpan() {
            return clickableSpan;
        }
    }
}

希望这可以帮助某人

编辑:如何更改链接颜色和删除下划线:

像这样创建和使用您自己的 ClickableSpan 实现:

//a version of ClickableSpan without the underline
public static class NoUnderlineClickableSpan extends ClickableSpan {
    private int color = -1;

    public void setColor(int color) {
        this.color = color;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setUnderlineText(false);
        if (this.color != -1) {
            ds.setColor(this.color);
        }
    }
}

【讨论】:

  • 不错!太好了,我可以帮你解决这个问题......我想我会再次使用你的课程来完成我的项目:)
  • 谢谢你,@Boy 工作完美。文字看起来带有下划线和蓝色。我该如何设计它?
  • 您必须定义一个自定义 ClickableSpan 才能在 ClickableWord 中使用。我将编辑我的回复并添加它
  • 查看我在编辑后的回复中编写的 NoUnderlineClickableSpan 类。我没有找到下划线的任何其他方式。
  • 谢谢你..它真的帮助了我。
【解决方案3】:

在 TextView 中使用带有链接的 HTML 比创建多个 TextView、关注布局、侦听器等要简单得多。

在您的活动或片段中:

    TextView mText = (TextView) findViewById(R.id.text_linkified);
    mText.setText(Html.fromHtml("Open <a href='myapp://my-activity'>My Activity</a> or" +
            " <a href='myapp://other-activity'>Other Activity</a>"));
    mText.setMovementMethod(LinkMovementMethod.getInstance());

在清单中

    <activity android:name=".MyActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:scheme="myapp" android:host="my-activity"/>
        </intent-filter>
    </activity>
    <activity android:name=".MyOtherActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:scheme="myapp" android:host="other-activity" />
        </intent-filter>
    </activity>

【讨论】:

  • 我在这里没有使用 url 只是文本我想通过点击文本打开新活动。
  • 如果文本没有改变,例如它在 strings.xml 中声明,那么这就是这样做的方法。只需将“可点击”文本声明为带有指向您活动的操作的 url。结果,您将仅获得在单击时打开新活动的文本,具体取决于您单击的文本部分。
  • 我编辑了答案,因为有巨魔投反对票。
  • 如果你想将 Parcelable 对象传递给你的新 Activity?
【解决方案4】:

我推荐这个库:https://github.com/klinker24/Android-TextView-LinkBuilder

它非常符合您的要求。

快速概览:

复制表单项目的自述文件:

  • 在 TextView 中指定特定单词的长按和短按操作
  • 通过在用户触摸文本时突出显示文本来提供用户反馈 匹配单个字符串或使用正则表达式将可点击链接设置为符合该模式的任何文本
  • 更改链接文本的颜色
  • 修改文本在用户触摸时突出显示的透明度
  • 设置是否要给文本加下划线

与 TextView 的自动链接功能相比,使用此库的主要优点是您可以链接任何内容,而不仅仅是网址、电子邮件和电话号码。它还提供颜色自定义和触摸反馈。

【讨论】:

    【解决方案5】:

    在 ClickableTextView 实现中,如果 string 得到一个带有 repeat 的单词会发生什么? 假设例如字符串是“我是可点击的,这也是可点击的”,那么这两个字符串都应该更改为 Spannable 字符串,但在这种情况下它失败了,只有一个会更改为 Spanable 字符串。

    【讨论】:

    • 你可以看看我的答案,它在所有单词上循环
    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 2018-06-03
    • 2012-04-15
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多