JavaFXPorts Kokos 项目不显示 Android 键盘
JavaFXPorts Kokos Project doesn't show the Android keyboard
我正在使用 JavaFX 和 Android 修改 kokos 项目,使用 jfxmobile 插件,当我添加文本字段时,屏幕键盘没有出现,我无法修改文本。
mytextfield
是 JavaFX 的 TextField class 的一个对象:
@FXML
public void initialize(){
counter = 0;
mytextfield.setStyle( "-fx-background-color:#FFFF00; -fx-skin: \"com.sun.javafx.scene.control.skin.TextFieldSkinAndroid\"; ");
mytextfield.requestFocus();
}
public void onButtonClick(){
counter++;
clickLabel.setText("You've clicked this button " + counter + " times!");
}
可能发生了什么?
我测试了 Kokos project, modifying the JavaFX application class 以包含 JavaFX TextField
:
@Override
public void start (Stage stage) throws Exception {
final Button b = new Button("Click JavaFX");
b.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
b.setText("Clicked");
}
});
Screen primaryScreen = Screen.getPrimary();
Rectangle2D visualBounds = primaryScreen.getVisualBounds();
double width = visualBounds.getWidth();
double height = visualBounds.getHeight();
VBox box = new VBox(10, b, new TextField());
box.setAlignment(Pos.CENTER);
Scene s = new Scene(box, width, height);
stage.setScene(s);
stage.show();
}
我可以重现问题:软键盘不显示。
对于初学者,您不需要为 TextField 设置 -fx-skin
属性,它将在内部应用。
如果您使用 adb logcat
或从 AndroidStudio 检查日志,您会注意到有一个调用在 textField 获得焦点时显示键盘,另一个在失去焦点时隐藏它:
V/FXEntity: Called notify_showIME
V/FXEntity: Done calling notify_showIME
...
V/FXEntity: Called notify_hideIME
V/FXEntity: Done Calling notify_hideIME
这意味着 JavaFX TextField 实际上执行了正确的调用来显示和隐藏键盘,但出现了故障。
经过一些调试,我注意到 activity_main.xml 正在使用它作为片段定义:
android:name="android.webkit.WebViewFragment"
对应于用于显示 WebView 的内置片段。
这不是我们需要的,所以我创建了一个片段:
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fx_fragment, container, false);
return view;
}
}
基于现有的fx_fragment.xml
,并相应修改activity_main.xml
:
<fragment
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name="javafxports.org.kokos.MyFragment"
android:id="@+id/fragment"
android:layout_gravity="left|top"
tools:layout="@layout/fx_fragment" />
就是这样,现在当您 运行 应用程序和 textField 获得焦点时,键盘出现,您可以在其中输入内容。
我正在使用 JavaFX 和 Android 修改 kokos 项目,使用 jfxmobile 插件,当我添加文本字段时,屏幕键盘没有出现,我无法修改文本。
mytextfield
是 JavaFX 的 TextField class 的一个对象:
@FXML
public void initialize(){
counter = 0;
mytextfield.setStyle( "-fx-background-color:#FFFF00; -fx-skin: \"com.sun.javafx.scene.control.skin.TextFieldSkinAndroid\"; ");
mytextfield.requestFocus();
}
public void onButtonClick(){
counter++;
clickLabel.setText("You've clicked this button " + counter + " times!");
}
可能发生了什么?
我测试了 Kokos project, modifying the JavaFX application class 以包含 JavaFX TextField
:
@Override
public void start (Stage stage) throws Exception {
final Button b = new Button("Click JavaFX");
b.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
b.setText("Clicked");
}
});
Screen primaryScreen = Screen.getPrimary();
Rectangle2D visualBounds = primaryScreen.getVisualBounds();
double width = visualBounds.getWidth();
double height = visualBounds.getHeight();
VBox box = new VBox(10, b, new TextField());
box.setAlignment(Pos.CENTER);
Scene s = new Scene(box, width, height);
stage.setScene(s);
stage.show();
}
我可以重现问题:软键盘不显示。
对于初学者,您不需要为 TextField 设置 -fx-skin
属性,它将在内部应用。
如果您使用 adb logcat
或从 AndroidStudio 检查日志,您会注意到有一个调用在 textField 获得焦点时显示键盘,另一个在失去焦点时隐藏它:
V/FXEntity: Called notify_showIME
V/FXEntity: Done calling notify_showIME
...
V/FXEntity: Called notify_hideIME
V/FXEntity: Done Calling notify_hideIME
这意味着 JavaFX TextField 实际上执行了正确的调用来显示和隐藏键盘,但出现了故障。
经过一些调试,我注意到 activity_main.xml 正在使用它作为片段定义:
android:name="android.webkit.WebViewFragment"
对应于用于显示 WebView 的内置片段。
这不是我们需要的,所以我创建了一个片段:
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fx_fragment, container, false);
return view;
}
}
基于现有的fx_fragment.xml
,并相应修改activity_main.xml
:
<fragment
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name="javafxports.org.kokos.MyFragment"
android:id="@+id/fragment"
android:layout_gravity="left|top"
tools:layout="@layout/fx_fragment" />
就是这样,现在当您 运行 应用程序和 textField 获得焦点时,键盘出现,您可以在其中输入内容。