- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有 TextView,其 ClickableStringSpan 类型的跨度定义如下:
public class ClickableStringSpan extends ClickableSpan {
private View.OnClickListener mListener;
int color;
public ClickableStringSpan(View.OnClickListener listener,int color) {
mListener = listener;
this.color = color;
}
@Override
public void onClick(View v) {
mListener.onClick(v);
}
@Override public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
ds.setColor(color);
}
}
我像这样在我的文本上设置可点击跨度:
spanStr.setSpan(new ClickableString(new linkedTextClickListener(), linkColor),
startIndex, endIndex,
SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
现在我想将这些字符串应用于 EditTexts 而不是 TextViews。一切都很好,只是现在不再点击可点击的字符串。我想知道如何将这种跨度上的点击传递给他们指定的点击监听器?
更新:我对编辑文本的主要关注是我希望允许用户选择文本的某些部分并在他/她可以单击 ClickableSpans 的同时共享它。
最佳答案
您需要将 TextView/EditText 的移动方法设置为 LinkMovementMethod 才能获得点击的链接。不幸的是,这会禁用选择文本的功能,只有将移动方法设置为 ArrowKeyMovementMethod 时才有效。 http://developer.android.com/reference/android/text/method/LinkMovementMethod.html http://developer.android.com/reference/android/text/method/ArrowKeyMovementMethod.html
为了解决这个问题,我创建了一个自定义的 MovementMethod 类,它继承自 ArrowKeyMovementMethod 并添加了单击链接的功能。 :
/**
* ArrowKeyMovementMethod does support selection of text but not the clicking of links.
* LinkMovementMethod does support clicking of links but not the selection of text.
* This class adds the link clicking to the ArrowKeyMovementMethod.
* We basically take the LinkMovementMethod onTouchEvent code and remove the line
* Selection.removeSelection(buffer);
* which deselects all text when no link was found.
*/
public class EnhancedMovementMethod extends ArrowKeyMovementMethod {
private static EnhancedMovementMethod sInstance;
public static MovementMethod getInstance() {
if (sInstance == null) {
sInstance = new EnhancedMovementMethod ();
}
return sInstance;
}
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
link[0].onClick(widget);
}
else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]));
}
return true;
}
/*else {
Selection.removeSelection(buffer);
}*/
}
return super.onTouchEvent(widget, buffer, event);
}
}
您只需设置 EditText 的移动方式即可:
yourEditTExt.setMovementMethod(EnhancedMovementMethod.getInstance());
上面的代码只适用于未格式化的文本,这意味着一旦您决定使用文本样式(粗体、斜体等)或不同的字体大小来格式化文本,它就不会再找到点击的链接。我确实有处理格式化文本的代码,但由于这不是问题的一部分,我使示例代码尽可能短。
关于android - 我怎样才能让 EditText 具有可点击的 Spannables 并且仍然可以通过 longClick 选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23363484/
我有一个 TextView,我想在其中插入笑脸。我正在使用以下代码将笑脸插入 Spannable private static final Map emoticons = new HashMap();
所以我的应用程序应该将用户的输入与应用程序提供的随机引用进行比较,我想用绿色为正确的单词着色,用红色着色错误的单词。 问题是我不知道如何使用 Spannable在一个循环中,尤其是文本总是在变化。 这
我在 Android 上布局文本时遇到以下问题。我基本上试图让两行文本的间距最小,并且每行的样式应该不同。我已经有了相当好的工作解决方案,其中两个单行 TextView 一个放在另一个下面,但我仍然在
我有一个聊天应用程序,可以在文本中添加表情符号。 EditText 字段有问题。表情符号图像出现,但如果我在普通键盘上按下退格按钮,我要更改为表情符号图片的文本就会出现,我必须删除几个字符,直到图片消
我正在使用 SpannableStringBuilder 在 TextView 上设置文本,但它在不同的设备上给我不同的结果。 这里是 spannableString 构建器的代码 Spannabl
我正在尝试将一段很长的文本(来自几个不同的数据)组合成 TextView 的内容。 我希望每一行都具有以下结构: {piece 1} | {piece 2} 我希望每个“{piece 1} |”都是浅
String aux = getInserzionista(offerta.getIdInserzionista()); sotto_titolo.setText("Offerta dal "
有没有办法从字符串资源中提取Spannable[] 东西?基本上类似于 Welcome to Mercury Welcome to Venus Wel
如何在 Spannable 中禁用交互,而不影响显示它的 TextView 的交互? 换句话说,我想禁用给定 Spannable 中的所有链接。我不能对跨度做任何假设(特别是,它们可以是覆盖 upda
我添加这样的文本: tv.setText("This is text created with StringBuilder"); 然后我跟踪用户长按了哪个词,并想在短时间内突出显示该词: tv.set
我需要为 EditText 的一部分设置样式。我希望文本为白色,背景为灰色。看起来很简单,但事实并非如此。 spanRange.setSpan(new BackgroundColorSpan(Colo
在 ListView 中的一行上使用 Button 并且能够使单行 Spannable 和数据库中的数据但是当我单击它时返回整个字符串而不是一个单词这里是我的代码来自 MyAdapter 类 将数据库
我在 RecyclerView CardView 的 SearchView 上设置了一个 Spannable。如果在 CardView 上找到用户输入的文本,该文本将以红色突出显示。清除 Search
我有一个 spannable,比如 [12]。我想读取 [ 和 ] 之间的数字。我怎样才能为 spannable 做到这一点? 最佳答案 Spannable 也是一个 CharSequence。这意味
我想使用自定义字体 为从EditText 中选择的文本设置样式。我在编译时遇到错误。 构造函数 StyleSpan(Typeface) 未定义。 下面是我正在申请的代码。 int start=edit
对于同一个字符串,我有两个 spannable 对象,它们都有不同的样式。我需要合并所有 spannable 对象并将所有样式显示到 TextView 中。 从 Html.fromHtml() 返回之
我试图在 TextView 中显示一段代码.代码行跨越 标签。调用前Html.fromHtml()在 String 上,我可以清楚地看到制表符和换行符,但是当我调用 fromHtml() 时将其转换为
我想合并 3 个 spannable 对象。此代码工作正常: Spannable s1 = new SpannableStringBuilder("bold"); s1.se
我正在准备一个包含用于自定义样式(例如粗体、斜体、下划线、颜色等)的复选框的应用...我对哪种方法对性能有好处感到有点困惑。我试过字体,但是当用户选择两个复选框时,它只显示最后一个值。效果不佳。 最佳
我有一个标签云,其中标签有背景色。不幸的是,我无法获得合适的行间距。 假设这是文本云: tag1 tag2 tag3 tagtext4 tagtext5 这是 TextView 的样式:
我是一名优秀的程序员,十分优秀!