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 获得焦点时,键盘出现,您可以在其中输入内容。