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

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

我的Android应用程序中有一个
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
中的“链接”,同时从该视图复制文本

我想在listener
OnLongClickListener
中设置类似于
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]供框架使用; 它不应该由应用程序直接实现。

上面的代码扩展了一个文档化的类,而不是实现接口。它所做的只是添加一个检查,看看链接是否被点击,或者是否使用了超类方法