2016-11-12 4 views
4

私はTextfieldを持っており、その内容をAndroidデバイスにコピーしたいと思います。テキストフィールドコピーアクションが長く保留されています(コピーポップアップ)

Windowsデスクトップアプリケーションとして実行すると、right clickというテキストを選択できます。可能な操作でpopup menuを取得しました。

Androidでもpopup menuを取得する方法はありますか。

+0

よく分かりませんが、コンテキストアクションメニューを探してみてください。 – Redman

答えて

5

プッシュ・アンド・ホールドイベントは、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はカスタムのものを持っています:

デスクトップのポップアップのように、さまざまなメニュー項目がコンテキストに基づいて自動的に変更されることに注意してください。

+0

'TextFieldBehavior'クラスとは何ですか?それという名前の実際のクラスはありませんか?あなたがTextFieldクラスを意味していたとしても、 'TextField.getContextMenu'はデフォルトのものを返しませんし、この' TextFieldBehaviour'クラスの中にdefautがあると言うことはできません。これらのタイプミスはありますか?デフォルトのコンテキストメニューは 'ContextMenuEvent'内にありますか? – Lealo

+0

ここにはタイプミスはありません。 'TextFieldBehavior'はプライベート(com.sun ...パッケージ)なので、アクセスすることはできません。しかし、 'ContextMenuEvent'を起動すると、そのクラスの' contextMenuRequested'によって処理されます。 –

0

クイック検索では、「コンテキストメニュー」と呼ばれるものが表示されます。 はここに小さな実装です:

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)を使用してコンテキストメニューのビューを登録することを忘れないでください。

関連する問題