简体   繁体   中英

Gluon mobile TextArea soft keyboard issue

I'm working with a multiple view project with FXML, generated by the Gluon plugin for IntelliJ.

I added a view (scan view) next to the generated primary and secondary view and provided code for navigation in the GluonApplication class.

The first time I navigate to scan view, a carret blinks in the textarea but the soft keyboard on my android device is not shown. When I navigate to another view the keyboard briefly shows itself and disappears after a second. Then when I navigate back to scan view, the soft keyboard does show. And finally, when I retract focus from the textarea with the back button on my android device, it's not possible to regain focus by tapping the textarea.

Any info welcome, cheers.

GluonApplication.java:

public class GluonApplication extends MobileApplication {

    public static final String PRIMARY_VIEW = HOME_VIEW;
    public static final String SECONDARY_VIEW = "Product View";
    public static final String SCAN_VIEW = "Scan View";
    public static final String MENU_LAYER = "Side Menu";

    @Override
    public void init() {
        //Add views.
        addViewFactory(PRIMARY_VIEW, () -> (View) new PicklistView().getView());
        addViewFactory(SECONDARY_VIEW, () -> (View) new ProductView().getView());
        addViewFactory(SCAN_VIEW, () -> (View) new ScanView().getView());

        //Navigation side bar configuration.
        NavigationDrawer drawer = new NavigationDrawer();
        NavigationDrawer.Header header = new NavigationDrawer.Header("Gluon Mobile",
                "Multi View Project",
                new Avatar(21, new Image(GluonApplication.class.getResourceAsStream("/icon.png"))));
        drawer.setHeader(header);

        final Item primaryItem = new Item("Picklist", MaterialDesignIcon.HOME.graphic());
        final Item secondaryItem = new Item("Product", MaterialDesignIcon.DASHBOARD.graphic());
        final Item scanItem = new Item("Scan", MaterialDesignIcon.DASHBOARD.graphic());
        drawer.getItems().addAll(primaryItem, secondaryItem, scanItem);

        drawer.selectedItemProperty().addListener((obs, oldItem, newItem) -> {
            hideLayer(MENU_LAYER);
            if (newItem.equals(primaryItem)) {
                switchView(PRIMARY_VIEW);
            } else if (newItem.equals(secondaryItem)) {
                switchView(SECONDARY_VIEW);
            } else {
                switchView(SCAN_VIEW);
            }
        });

        addLayerFactory(MENU_LAYER, () -> new SidePopupView(drawer));
    }

scan.fxml:

<?import com.gluonhq.charm.glisten.mvc.View?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>

<View fx:id="scan" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="350.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.essers.pxl2016.scan.views.ScanPresenter">
    <center>
        <VBox alignment="TOP_CENTER" BorderPane.alignment="CENTER">
            <children>
                <Label fx:id="label" text="scan output label">
               <VBox.margin>
                  <Insets bottom="5.0" />
               </VBox.margin></Label>
                <TextArea fx:id="input" />
            </children>
        </VBox>
    </center>
   <padding>
      <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
   </padding>
</View>

ScanPresenter:

public class ScanPresenter {
    @FXML
    private View scan;
    @FXML
    private Label label;
    @FXML
    private TextArea input;

    private String oldString;

    public void initialize() {
        scan.showingProperty().addListener((obs, oldValue, newValue) -> {
            // Update app bar.
            if (newValue) {
                AppBar appBar = MobileApplication.getInstance().getAppBar();
                appBar.setNavIcon(MaterialDesignIcon.MENU.button(e ->
                        MobileApplication.getInstance().showLayer(GluonApplication.MENU_LAYER)));
                appBar.setTitleText("Scan");
                appBar.getActionItems().add(MaterialDesignIcon.CLOSE.button(e ->
                        javafx.application.Platform.exit()));
            }
        });

        input.textProperty().addListener((observable, oldValue, newValue) -> {
            if (oldValue.equals(newValue)) {
                return;
            } else {
                label.setText(newValue);
            }
        });

        input.requestFocus();
    }
}

This was a known issue, but it seems it was only fixed for TextFields: https://bitbucket.org/javafxports/8u-dev-rt/commits/ef07043d5739ace78568f20d7bc89ba0cf60c4e0

I've just created a pull request that will fix this issue for TextArea as well: https://bitbucket.org/javafxports/8u-dev-rt/pull-requests/5/fix-jfxport-41/diff

The new release of JavaFXPorts (version 8.60.7) is planned to be created somewhere next week. These fixes are included in JavaFXPorts 8.60.7, which was released on March 31, 2016 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM