当前位置: 首页 > 知识库问答 >
问题:

可点击的链接和复制/粘贴菜单在编辑视图在Android

东方宜
2023-03-14

我的Android应用程序中有一个EditText视图。我需要“内部链接”,这意味着我需要EditText中的一些按钮或span,通过点击to this button,我可以执行一些操作(不重定向到网页)。我是这样用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);

为了让这个span可以点击,我使用了

et.setMovementMethod(LinkMovementMethod.getInstance ());

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

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

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

谢谢!

共有2个答案

吕文林
2023-03-14

我解决了这个问题,也许这对某人来说会很有趣…

对于我使用的EditText中的可点击链接

et.setMovementMethod(LinkMovementMethod.getInstance());

在这种情况下,在longClick菜单中没有复制/粘贴项目。要激活它们,我需要回到正常的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);

希望这能帮助到某人!

朱毅
2023-03-14

我不认为让用户在链接和复制模式之间切换会为你赢得可用性奖。我的解决方案允许你选择文本并同时打开链接。为了实现这一点,我简单地扩展了允许选择文本的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]旨在供框架使用;它不应该由应用程序直接实现。http://developer . Android . com/reference/Android/text/method/movement method . html

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

 类似资料:
  • 问题内容: 我了解您可以: 但是我找不到钩住复制和粘贴菜单的任何内容,因此在调用复制和粘贴菜单时,当前选择的JTextField将受到影响(例如,粘贴会将剪贴板粘贴到所选的JTextField中。 问题答案: 与Mac OS X的“系统和应用程序”菜单不同,“编辑”菜单完全在程序的权限范围内。您必须使用approariate创建并填充它Action。中定义的预定义子类非常方便,因为它们知道关注的组

  • 注意: Adobe Muse 不再添加新增功能,并将于 2020 年 3 月 26 日停止支持。有关详细信息和帮助,请参阅 Adobe Muse 服务结束页面。 对于网站设计人员来说,一致的设计和样式可能是网站最重要的要求之一。为实现这一目标,您可以重复使用样式,或者通过控件栏手动调整格式。手动设置仅适用于小型网站,重复次数受到限制。但是,手动设置格式或使用样式面板复制样式都要耗费时间和精力。此外

  • 我正在尝试点击一个菜单链接,但没有任何运气。它总是显示异常- 线程“main”org.openqa.selenium.WebDriverException中出现异常:未知错误:元素在点(64,64)处不可单击。其他元素将收到单击: 我有以下片段 这是一张快照- 我用下面的代码来完成同样的任务- 我检查了DOM中接受单击的 标记。但我看到了这个 带有一个附加属性,即 驱动程序- 我不知道如何处理这种

  • 问题内容: 我的.emacs中有(cua-mode t),因此Cc是复制的,而Cv是粘贴的,就像桌面上的其他大多数程序(Ubuntu,Gnome,Linux)一样。但是,Emacs似乎并未与其他程序共享剪贴板/复制缓冲区。 例如,如果我在Firefox中使用Cc,则可以将SCv粘贴到终端中,或者将Cv粘贴到gedit中。但是,如果我在emacs中使用Cv(或Cy),则无法获得从Firefox复制的

  • 本文向大家介绍js实现点击图片将图片地址复制到粘贴板的方法,包括了js实现点击图片将图片地址复制到粘贴板的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js实现点击图片将图片地址复制到粘贴板的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的javascript程序设计有所帮助。

  • 如何在Windows环境下在Ubuntu上执行从Windows 10到Bash的复制粘贴操作? 我尝试了以下方法: ctrlshiftv 有什么建议吗?