私はTextfieldを持っており、その内容をAndroidデバイスにコピーしたいと思います。テキストフィールドコピーアクションが長く保留されています(コピーポップアップ)
Windowsデスクトップアプリケーションとして実行すると、right click
というテキストを選択できます。可能な操作でpopup menu
を取得しました。
Androidでもpopup menu
を取得する方法はありますか。
私はTextfieldを持っており、その内容をAndroidデバイスにコピーしたいと思います。テキストフィールドコピーアクションが長く保留されています(コピーポップアップ)
Windowsデスクトップアプリケーションとして実行すると、right click
というテキストを選択できます。可能な操作でpopup menu
を取得しました。
Androidでもpopup menu
を取得する方法はありますか。
プッシュ・アンド・ホールドイベントは、questionのようにJavaFXで簡単にシミュレートできます。
初期イベントを取得したら、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");
}
}
:
良いニュースは、あなたがのためのContextMenuを変更する必要はありませんですAndroid、JavaFXはカスタムのものを持っています:
デスクトップのポップアップのように、さまざまなメニュー項目がコンテキストに基づいて自動的に変更されることに注意してください。
'TextFieldBehavior'クラスとは何ですか?それという名前の実際のクラスはありませんか?あなたがTextFieldクラスを意味していたとしても、 'TextField.getContextMenu'はデフォルトのものを返しませんし、この' TextFieldBehaviour'クラスの中にdefautがあると言うことはできません。これらのタイプミスはありますか?デフォルトのコンテキストメニューは 'ContextMenuEvent'内にありますか? – Lealo
ここにはタイプミスはありません。 'TextFieldBehavior'はプライベート(com.sun ...パッケージ)なので、アクセスすることはできません。しかし、 'ContextMenuEvent'を起動すると、そのクラスの' contextMenuRequested'によって処理されます。 –
クイック検索では、「コンテキストメニュー」と呼ばれるものが表示されます。 はここに小さな実装です:
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;
}
あなたはそれが「onCreateContextMenu」から指定されたタイトルやオプションを持つポップアップが表示さのTextViewをクリックします。オプションを選択すると、 "OnContextItemSelected"が呼び出されます。次に、あなたが望むように変数 "text"を使うことができます。 registerForContextMenu(tv)を使用してコンテキストメニューのビューを登録することを忘れないでください。
よく分かりませんが、コンテキストアクションメニューを探してみてください。 – Redman