【问题标题】:Using linked spans in textview在 textview 中使用链接跨度
【发布时间】:2013-04-08 03:26:27
【问题描述】:

我有一个以编程方式在 B 类中创建的文本视图。当 A 类调用它时。

它添加文字说“我去了商店”,我需要“the”这个词作为链接。这是我在 B 类中使用它完成的

sb.setSpan(new MyClickableSpan(Word), start, start+Word.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

调用类 MyClickableSpan

public class MyClickableSpan extends ClickableSpan {
private String word;

public MyClickableSpan(String word) {
    this.word = word;
}

@Override
public void onClick(View widget) {

    Log.d("Spaannnned",word);

}
}

因此,当单击此链接时,它会显示在我的日志中。

但我需要它来运行 A 类中的函数并传入单词。

请帮忙

【问题讨论】:

    标签: java android hyperlink textview spannable


    【解决方案1】:

    只需向您的 span 添加一个点击侦听器接口:

    public class MyClickableSpan extends ClickableSpan {
    public interface SpanClickListener
    {
         public void onSpanClicked(View widget, MyClickableSpan span);
    }
    private String word;
    private SpanClickListener clickListener;
    
    public MyClickableSpan(String word, SpanClickListener listener) {
        this.word = word;
        clickListener = listener;
    }
    public String getWord() { return word; }
    
    @Override
    public void onClick(View widget) {
            Log.d("Spaannnned",word);
            if (clickListener != null) clickListener.onSpanClicked(widget, this);
        }
    }
    


    然后,在您的活动中:

    MyClickableSpan span = new MyClickableSpan("Hello!", new MyClickableSpan.SpanClickListener() {
               @Override
               public void onSpanClicked(View widget, MyClickableSpan span)
               {
                    Toast.makeText(context, span.getWord(), Toast.LENGTH_SHORT);
               }
            };
    ....
    //add your span to the Spannable or whatever you want.
    

    【讨论】:

    • 但是用这种方法是不是必须在a类中设置span?目前还不是一个选项
    • 好吧,如果你想在 A 类中调用某些东西,那么无论如何你必须以某种方式提供对 A 实例的引用给 B 类。除非您使用某种消息总线或消息队列,否则我认为情况并非如此。
    • 只需在 A 中创建一个 SpanClickListener 实例,然后将其提供给 B 类,该类将在创建跨度时使用它。
    • 谢谢你,我大部分都是用你的想法。作为 B 类创建跨度,我也将它们保存在数组列表中。然后在 A 类中,我使用 for 循环告诉它活动。然后实现 mySpanListener ,它似乎工作。感谢您的帮助
    【解决方案2】:

    将您的“A 类”实例提供给 MyClickableSpan 的构造函数,将其保存在数据成员中,然后在您的 onClick() 方法中使用它。

    或者,使用event bus like Otto,让 onClick() 发送“A 类”订阅的消息。

    【讨论】:

    • Otto 看起来很有趣.. 明天再看。不幸的是,设置跨度的 b 类。不知道a类。
    猜你喜欢
    • 2020-09-13
    • 2011-06-29
    • 1970-01-01
    • 2019-10-17
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多