gpt4 book ai didi

android - 我怎样才能让 EditText 具有可点击的 Spannables 并且仍然可以通过 longClick 选择?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:03:29 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com