长按文本字段复制操作(复制弹出窗口)

Textfield copy action on long hold (copy popup)

我有 Textfield,我想在我的 android 设备上复制它的内容。

如果我 运行 它作为 windows 桌面应用程序,我可以 select 文本 right click 我得到 popup menu 和可能的操作。

有没有办法在 Android 上也得到这个 popup menu

快速搜索会显示一个名为 "Context Menu" 的内容。 这是一个小实现:

TextView tv;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv = (TextView) findViewById(R.id.tv1);
            registerForContextMenu(tv);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
    {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("Select The Action");
        menu.add(0, v.getId(), 0, "Copy");//groupId, itemId, order, title
    }
    @Override
    public boolean onContextItemSelected(MenuItem item){
        if(item.getTitle()=="Copy"){
            String text = tv.getText().toString();
            Log.e("onContextItemSelected",text);
        }

        return true;
    }

当您点击 textView 时,它会显示一个带有来自 "onCreateContextMenu" 的给定标题和选项的弹出窗口。一旦你 select 一个选项 "OnContextItemSelected" 被调用。然后你可以根据需要使用变量 "text" 。不要忘记使用 registerForContextMenu(tv) 为上下文菜单注册视图。

在 JavaFX 中可以很容易地模拟按住事件,如 question

获得初始事件后,您需要做的就是从 TextField 调用 ContextMenu。由于 TextField.getContextMenu() 不会 return 默认值,您可以提供自己的或尝试获取默认值。

获取默认值有点棘手,因为它是 TextFieldBehavior class 的一部分。它包含此方法 public void contextMenuRequested(ContextMenuEvent e);,因此您需要做的就是提供一个 ContextMenuEvent,并从 TextField 触发事件。

这是一个快速实施:

public class BasicView extends View {

    public BasicView(String name) {
        super(name);

        TextField textField = new TextField();

        addPressAndHoldHandler(textField, Duration.seconds(1), event -> {
            Bounds bounds = textField.localToScreen(textField.getBoundsInLocal());
            textField.fireEvent(new ContextMenuEvent(ContextMenuEvent.CONTEXT_MENU_REQUESTED, 
                    0, 0, bounds.getMinX() + 10, bounds.getMaxY() + 10, false, null));
        });

        setCenter(new VBox(15.0, new Label("Push and hold for ContextMenu"), textField));
    }

    private void addPressAndHoldHandler(Node node, Duration holdTime, EventHandler<MouseEvent> handler) {
        class Wrapper<T> { 
            T content; 
        }

        Wrapper<MouseEvent> eventWrapper = new Wrapper<>();

        PauseTransition holdTimer = new PauseTransition(holdTime);
        holdTimer.setOnFinished(event -> handler.handle(eventWrapper.content));

        node.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> {
            eventWrapper.content = event;
            holdTimer.playFromStart();
        });
        node.addEventHandler(MouseEvent.MOUSE_RELEASED, event -> holdTimer.stop());
        node.addEventHandler(MouseEvent.DRAG_DETECTED, event -> holdTimer.stop());
    }

    @Override
    protected void updateAppBar(AppBar appBar) {
        appBar.setTitleText("Push and Hold");
    }

}

在桌面版中,您将获得以下内容:

好消息是您不需要修改 Android 的上下文菜单,JavaFX 有一个自定义菜单:

请注意,不同的菜单项会根据上下文自动更改,如在桌面弹出窗口中一样。