Действие копирования текстового поля при длительном удержании (всплывающее окно копирования)

У меня есть Textfield, и я хочу скопировать его содержимое на свое устройство Android.

Если я запускаю его как приложение для рабочего стола Windows, я могу выбрать текст right click Я получил popup menu с возможными действиями.

Есть ли способ получить этот popup menu также и на Android?


person patrz jaka franca    schedule 12.11.2016    source источник
comment
я мало что знаю, но попробуйте поискать контекстное меню действий   -  person Manohar    schedule 12.11.2016


Ответы (2)


Событие нажатия и удержания можно легко смоделировать в JavaFX, как в этом вопрос.

Как только вы получите начальное событие, все, что вам нужно сделать, это вызвать ContextMenu из TextField. Поскольку 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");
    }

}

На рабочем столе это то, что вы получите:

Хорошей новостью является то, что вам не нужно изменять ContextMenu для Android, у JavaFX есть собственный:

Обратите внимание, что различные пункты меню будут меняться автоматически в зависимости от контекста, как во всплывающем окне на рабочем столе.

person José Pereda    schedule 12.11.2016
comment
Что такое TextFieldBehavior - класс? Нет никакого реального класса с таким именем? И если вы имели в виду класс TextField, вы не можете иметь в виду, что TextField.getContextMenu... не вернет вам класс по умолчанию, а затем скажет, что значение по умолчанию находится внутри этого класса TextFieldBehaviour. Это проблемы с опечатками? Контекстное меню по умолчанию находится внутри ContextMenuEvent, не так ли? - person Lealo; 02.09.2017
comment
Здесь нет опечаток. TextFieldBehavior является частным (пакет com.sun...), поэтому вы не можете получить к нему доступ. Но если вы запустите ContextMenuEvent, это будет обработано contextMenuRequested в этом классе. - person José Pereda; 02.09.2017

Быстрый поиск покажет вам что-то под названием «Контекстное меню». Вот небольшая реализация:

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». После выбора опции вызывается «OnContextItemSelected». Затем вы можете использовать переменную «текст» по своему усмотрению. Не забудьте зарегистрировать представление для контекстного меню с помощью registerForContextMenu(tv).

person nayakasu    schedule 12.11.2016