Skip to content

Commit 5d34d72

Browse files
abhinayagarwalJohan Vos
authored and
Johan Vos
committed
8245053: Keyboard doesn't show when TextInputControl has focus
Reviewed-by: jvos
1 parent a46b250 commit 5d34d72

File tree

2 files changed

+87
-30
lines changed

2 files changed

+87
-30
lines changed

modules/javafx.controls/src/android/java/javafx/scene/control/skin/TextAreaSkinAndroid.java

+43-14
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,56 @@
2626
package javafx.scene.control.skin;
2727

2828
import javafx.beans.value.ChangeListener;
29-
import javafx.beans.value.ObservableValue;
29+
import javafx.beans.value.WeakChangeListener;
30+
import javafx.event.EventHandler;
3031
import javafx.scene.control.TextArea;
31-
import javafx.scene.control.skin.TextAreaSkin;
32+
import javafx.scene.input.MouseEvent;
3233

3334
public class TextAreaSkinAndroid extends TextAreaSkin {
3435

36+
/**************************************************************************
37+
*
38+
* Private fields
39+
*
40+
**************************************************************************/
41+
42+
private final EventHandler<MouseEvent> mouseEventListener = e -> {
43+
if (getSkinnable().isEditable() && getSkinnable().isFocused()) {
44+
showSoftwareKeyboard();
45+
}
46+
};
47+
48+
private final ChangeListener<Boolean> focusChangeListener = (observable, wasFocused, isFocused) -> {
49+
if (wasFocused && !isFocused) {
50+
hideSoftwareKeyboard();
51+
}
52+
};
53+
private final WeakChangeListener<Boolean> weakFocusChangeListener = new WeakChangeListener<>(focusChangeListener);
54+
55+
/**************************************************************************
56+
*
57+
* Constructors
58+
*
59+
**************************************************************************/
60+
3561
public TextAreaSkinAndroid(final TextArea textArea) {
3662
super(textArea);
63+
textArea.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventListener);
64+
textArea.focusedProperty().addListener(weakFocusChangeListener);
65+
}
66+
67+
/***************************************************************************
68+
* *
69+
* Public API *
70+
* *
71+
**************************************************************************/
3772

38-
textArea.focusedProperty().addListener(new ChangeListener<Boolean>() {
39-
public void changed(ObservableValue<? extends Boolean> observable,
40-
Boolean wasFocused, Boolean isFocused) {
41-
if (textArea.isEditable()) {
42-
if (isFocused) {
43-
showSoftwareKeyboard();
44-
} else {
45-
hideSoftwareKeyboard();
46-
}
47-
}
48-
}
49-
});
73+
/** {@inheritDoc} */
74+
@Override public void dispose() {
75+
if (getSkinnable() == null) return;
76+
getSkinnable().removeEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventListener);
77+
getSkinnable().focusedProperty().removeListener(weakFocusChangeListener);
78+
super.dispose();
5079
}
5180

5281
native void showSoftwareKeyboard();

modules/javafx.controls/src/android/java/javafx/scene/control/skin/TextFieldSkinAndroid.java

+44-16
Original file line numberDiff line numberDiff line change
@@ -26,29 +26,57 @@
2626
package javafx.scene.control.skin;
2727

2828
import javafx.beans.value.ChangeListener;
29-
import javafx.beans.value.ObservableValue;
29+
import javafx.beans.value.WeakChangeListener;
30+
import javafx.event.EventHandler;
3031
import javafx.scene.control.TextField;
31-
32-
import com.sun.javafx.scene.control.behavior.TextFieldBehavior;
33-
import javafx.scene.control.skin.TextFieldSkin;
32+
import javafx.scene.input.MouseEvent;
3433

3534
public class TextFieldSkinAndroid extends TextFieldSkin {
3635

36+
/**************************************************************************
37+
*
38+
* Private fields
39+
*
40+
**************************************************************************/
41+
42+
private final EventHandler<MouseEvent> mouseEventListener = e -> {
43+
if (getSkinnable().isEditable() && getSkinnable().isFocused()) {
44+
showSoftwareKeyboard();
45+
}
46+
};
47+
48+
private final ChangeListener<Boolean> focusChangeListener = (observable, wasFocused, isFocused) -> {
49+
if (wasFocused && !isFocused) {
50+
hideSoftwareKeyboard();
51+
}
52+
};
53+
private final WeakChangeListener<Boolean> weakFocusChangeListener = new WeakChangeListener<>(focusChangeListener);
54+
55+
/**************************************************************************
56+
*
57+
* Constructors
58+
*
59+
**************************************************************************/
60+
3761
public TextFieldSkinAndroid(final TextField textField) {
3862
super(textField);
3963

40-
textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
41-
public void changed(ObservableValue<? extends Boolean> observable,
42-
Boolean wasFocused, Boolean isFocused) {
43-
if (textField.isEditable()) {
44-
if (isFocused) {
45-
showSoftwareKeyboard();
46-
} else {
47-
hideSoftwareKeyboard();
48-
}
49-
}
50-
}
51-
});
64+
textField.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventListener);
65+
textField.focusedProperty().addListener(weakFocusChangeListener);
66+
}
67+
68+
/***************************************************************************
69+
* *
70+
* Public API *
71+
* *
72+
**************************************************************************/
73+
74+
/** {@inheritDoc} */
75+
@Override public void dispose() {
76+
if (getSkinnable() == null) return;
77+
getSkinnable().removeEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventListener);
78+
getSkinnable().focusedProperty().removeListener(weakFocusChangeListener);
79+
super.dispose();
5280
}
5381

5482
native void showSoftwareKeyboard();

0 commit comments

Comments
 (0)