长时间保留的文本字段复制操作(复制弹出窗口)

时间:2016-11-12 10:32:05

标签: android javafx javafxports

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

如果我将其作为Windows桌面应用程序运行,我可以选择right click文本popup menu并执行可能的操作。

无论如何还要在Android上获得此popup menu吗?

2 个答案:

答案 0 :(得分:5)

可以在JavaFX中轻松模拟推送和保持事件,如此question

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

获取默认值有点棘手,因为它是TextFieldBehavior类的一部分。它包含此方法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修改ContextMenu,JavaFX有一个自定义的:

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

答案 1 :(得分:0)

快速搜索会显示一些名为&#34; Context Menu&#34;的内容。 这是一个小实现:

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时,它会显示一个带有给定标题的弹出窗口和来自&#34; onCreateContextMenu&#34;的选项。一旦你选择了一个选项&#34; OnContextItemSelected&#34;叫做。然后你可以使用变量&#34; text&#34;如你所愿。不要忘记使用registerForContextMenu(tv)注册上下文菜单视图。