2016-03-28 4 views
1

グルーオンビューの中央ノードとして、私はvboxにいくつかのテキストフィールドを含むスクロールペインを持っています。これらのテキストフィールドの1つがフォーカスオーナになり、キーボードが現れたとき、テキストフィールドはキーボードのレイアウトに従って再配置されないので、キーボードによって覆われたままになります。 私はAndroidManifestに キーボードカバーTextField

android:windowSoftInputMode="adjustResize" 

を入れてみましたが、任意の成功なし。私は、可視領域に覆われたテキストフィールドのy座標を変換回避策として

。アンドロイドの戻るボタンを押してキーボードを隠すと、テキストフィールドの位置は元の状態にリセットされます。私はここにきてるの問題は、私はAndroidの戻るボタン、私はリスナーを追加していないことについては、イベントを取得していないということです。

view.addEventFilter(MobileEvent.BACK_BUTTON_PRESSED, evt -> eventFilter); 

MobileApplication.getInstance().getGlassPane().addEventFilter(MobileEvent.BACK_BUTTON_PRESSED, evt -> eventFilter); 

を下のノードの位置を処理するために、あらゆる可能性がありますキーボード、またはキーボード自体への参照を取得するには?

答えて

1

これは私がこれまで思い付くできるソリューションです:私は、これは、より簡単な方法だと思う

public class PositionAdjuster { 

    public static void main(String[] args) { launch(args); } 

    private static final float SCALE = FXActivity.getInstance().getResources().getDisplayMetrics().density; 

    private Node     nodeToAdjust; 
    private ObservableValue<Node> focusOwner; 

    private ViewGroup    viewGroup; 
    private Rect     currentBounds; 
    private DoubleProperty height; 

    private OnGlobalLayoutListener layoutListener; 

    public PositionAdjuster(Node nodeToAdjust, ObservableValue<Node> focusOwner) { 
     this.nodeToAdjust = nodeToAdjust; 
     this.focusOwner = focusOwner; 

     initLayoutListener(); 
    } 

    private void initLayoutListener() { 
     double screenHeight = MobileApplication.getInstance().getScreenHeight(); 
     height = new SimpleDoubleProperty(screenHeight); 
     height.addListener((ov, n, n1) -> onHeightChanged(n, n1)); 

     layoutListener =() -> height.set(getCurrentHeigt()); 

     viewGroup = FXActivity.getViewGroup(); 
     viewGroup.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener); 
     currentBounds = new Rect(); 
    } 

    private float getCurrentHeigt() { 
     viewGroup.getRootView().getWindowVisibleDisplayFrame(currentBounds); 
     return currentBounds.height()/SCALE; 
    } 

    private void onHeightChanged(Number oldValue, Number newValue) { 
     double heightDelta = newValue.doubleValue() - oldValue.doubleValue(); 

     if (heightDelta < 0) { 
      double maxY = getBoundsInScene(nodeToAdjust)).getMaxY(); 
      double currentMaxY = heightDelta + maxY; 

      double result = currentMaxY- getBoundsInScene(focuseOwner.getValue()).getMaxY(); 

      if (result < 0) { 
       nodeToAdjust.setTranslateY(result); 
      } 

     } else if (heightDelta > 0) { 
      nodeToAdjust.setTranslateY(0); 
     } 
    } 

    private Bounds getBoundsInScene(Node node) { 
     return node.localToScene(node.getBoundsInLocal()); 
    } 

    public void removeListener() { 
     viewGroup.getViewTreeObserver().removeOnGlobalLayoutListener(layoutListener); 
    } 
} 

EDIT。以前のバージョンは、noteToAdjustのmaxYがスクリーンの高さに等しいことに依存していた。 bottomBarの存在。 focusedNodeのmaxY位置は、表示可能な画面の高さに対して検証され、その差はその親の位置を変更するために使用されます。

public AndroidPositionAdjuster(Node parent, ObservableValue<Node> focusOwner) { 
    this.parent = parent; 
    this.focusOwner = focusOwner; 

    initLayoutListener(); 
} 

private void onHeightChanged(Number oldHeight, Number newHeight) { 
    double heightDelta = newHeight.doubleValue() - oldHeight.doubleValue(); 

    if (heightDelta < 0) { 
     double maxY = newHeight.doubleValue(); 
     double focusedNodeY = getBoundsInScene(focusOwner.getValue()).getMaxY(); 
     double result = maxY - focusedNodeY; 

     if (result < 0) { 
      parent.setTranslateY(result); 
     } 

    } else if (heightDelta > 0) { 
     parent.setTranslateY(0); 
    } 
} 
+0

うまくやった!あなたはそれを完全に稼働させましたか?ハンドラをインストールするには、さらにいくつかの手順が必要です。 –

+0

そうです。私はあなたが "それはいくつかの余分なステップが必要"とは何を意味するのだろうか? GlobalLayoutListenerは完全に機能します。私はrootViewにアクセスする方法が不明でした。 「FXActivity.getViewGroup()。getRootView()」または「FXActivity.getInstance()。getWindow()。getDecorView()」のいずれかです。 – jns

+0

私はマルチビュープロジェクトで、アジャスターをtextFieldにインストールするには、ビューが表示されているときにリスニングする必要があることを意味しました。 –

1

だけの層がMobileEvent.BACK_BUTTON_PRESSEDイベントを取得します。 1つの解決策は、ネイティブになり、Android APIを使用することです。

+0

興味深いヒント、pedroありがとうございます。おそらくそれは魅力のドキュメントにあるはずです。 – jns

+0

これは将来変更されます。チャームダウンはボタンイベントを戻します。 – Pedro