progonkpa
progonkpa

Reputation: 3950

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();
    }
}

Upvotes: 0

Views: 576

Answers (1)

Joeri Sykora
Joeri Sykora

Reputation: 514

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.

Upvotes: 1

Related Questions