长按文本字段复制操作(复制弹出窗口)
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 有一个自定义菜单:
请注意,不同的菜单项会根据上下文自动更改,如在桌面弹出窗口中一样。
我有 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 有一个自定义菜单:
请注意,不同的菜单项会根据上下文自动更改,如在桌面弹出窗口中一样。