gpt4 book ai didi

android - android中EditView中的可点击链接和复制/粘贴菜单

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:51:38 24 4
gpt4 key购买 nike

我的 Android 应用程序中有一个 EditText View 。我需要其中的“内部链接”,这意味着我需要一些按钮或 EditText 内的 span 并使用 onClick 到此按钮我可以执行一些操作(不重定向到网络页)。我用这样的 ClickableSpan() 实现了这个按钮

linkWord = "my link";
link = new SpannableString(linkWord);
cs = new ClickableSpan(){
private String w = linkWord;
@Override
public void onClick(View widget) {
wrd.setText(w);
}
};
link.setSpan(cs, 0, linkWord.length(), 0);
et.append(link);

为了使这个跨度可点击,我使用了

et.setMovementMethod(LinkMovementMethod.getInstance());

“内部链接”工作正常,但在使用 et.setMovementMethod() 后,复制和粘贴项目在 OnLongClick 菜单上被禁用。这是一个问题,因为我需要 EditText 中的“链接”并同时从该 View 复制文本。

我想在监听器 OnLongClickListener 中设置类似 removeMovementMethod() 的东西,用于临时禁用“链接”功能,并使用带有复制/粘贴功能的菜单,并在复制文本后打开setMovementMethod() 方法。但我不知道如何实现这一点。

你能帮帮我吗?您可能还有其他一些方法...

谢谢!

最佳答案

我认为让用户在链接和复制模式之间切换不会为您赢得可用性奖。我的解决方案允许您同时选择文本和打开链接。为实现这一点,我只需扩展 ArrowKeyMovementMethod,它允许选择文本,并从 LinkMovementMethod 添加 onTouchEvent() 方法,它处理链接的点击/触摸。只有一行代码需要更改,即当在触摸屏幕的坐标处找不到链接时从 TextView 中删除选择的代码。

这是完整的类:

public class MyMovementMethod extends ArrowKeyMovementMethod {

private static MyMovementMethod sInstance;

public static MovementMethod getInstance() {
if (sInstance == null) {
sInstance = new MyMovementMethod ();
}
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 {
that's the line we need to remove
Selection.removeSelection(buffer);
}*/
}

return super.onTouchEvent(widget, buffer, event);
}

}

这样做是非常安全的,即使文档指出:

This interface [MovementMethod] is intended for use by the framework; it should not be implemented directly by applications. http://developer.android.com/reference/android/text/method/MovementMethod.html

上面的代码扩展了一个记录类而不是实现接口(interface)。它所做的只是添加一个检查以查看链接是否被点击,否则使用父类(super class)方法。

关于android - android中EditView中的可点击链接和复制/粘贴菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10572389/

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