android中EditView中的可点击链接和复制/粘贴菜单
我的Android应用程序中有一个android中EditView中的可点击链接和复制/粘贴菜单,android,hyperlink,copy,android-edittext,Android,Hyperlink,Copy,Android Edittext,我的Android应用程序中有一个EditText视图。我需要它的“内部链接”,这意味着我需要一些按钮或span内部EditText,通过onClick,我可以执行一些操作(不重定向到网页)。 我用ClickableSpan()像这样实现了这个按钮 linkWord = "my link"; link = new SpannableString(linkWord); cs = new ClickableSpan(){ private String w = linkWord; @Overr
EditText
视图。我需要它的“内部链接”,这意味着我需要一些按钮或span内部EditText
,通过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()之后,onlong单击菜单上的复制和粘贴项被禁用。这是一个问题,因为我需要EditText
中的“链接”,同时从该视图复制文本
我想在listenerOnLongClickListener
中设置类似于removeMovementMethod()
的临时禁用“链接”功能,使用带有复制/粘贴的菜单,并在处理文本后再次打开setMovementMethod()
方法。但我不知道如何认识到这一点
你能帮我吗?你可能有其他的方法
谢谢大家! 我解决了这个问题,也许这对某人来说会很有趣
对于我使用的EditText中的可单击链接
et.setMovementMethod(LinkMovementMethod.getInstance());
在这种情况下,长单击菜单中没有复制/粘贴项。
要激活它们,我需要返回到正常的EditText状态,我可以使用:
et.setMovementMethod(ArrowKeyMovementMethod.getInstance());
使用此方法后,链接将不起作用,但会出现正常的长单击菜单
因此,我在上下文菜单中添加了新项,并在这两个选项之间切换:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
if(et.getSelectionStart() == -1){ // in case of setMovementMethod(LinkMovementMethod.getInstance())
menu.add(0, 1, 0, "Enable copy");
}
else{
menu.add(0, 2, 0, "Enable links");
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1:
et.setMovementMethod(ArrowKeyMovementMethod.getInstance());
et.setSelection(0, 0);
//re-register EditText for context menu:
unregisterForContextMenu(et);
registerForContextMenu(et);
break;
case 2:
et.setMovementMethod(LinkMovementMethod.getInstance());
break;
}
return true;
}
我还为上下文菜单注册了EditText:
registerForContextMenu(et);
希望这能帮助别人 我不认为让用户在链接和复制模式之间切换将为您赢得可用性奖。我的解决方案允许您选择文本,同时打开链接。为了实现这一点,我只需扩展允许选择文本的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);
}
}
即使文档中指出:
此接口[MovementMethod]供框架使用;
它不应该由应用程序直接实现。
上面的代码扩展了一个文档化的类,而不是实现接口。它所做的只是添加一个检查,看看链接是否被点击,或者是否使用了超类方法