input field hidden when soft keyboard appears in phonegap

后端 未结 8 955
失恋的感觉
失恋的感觉 2020-12-03 12:41

Creating a mobile application using Phonegap 3.6.3 for Android and iOS. The problem is only for Android, as iOS acts as I would like it to.

When I click on an input

相关标签:
8条回答
  • 2020-12-03 13:12

    Remove this line from config.xml

    <preference name="android-windowSoftInputMode" value="adjustResize|stateHidden" />
    

    And change the line in 'head of web page' to

    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
    
    0 讨论(0)
  • 2020-12-03 13:14

    My solution was using Ionic keyboard plugin and implementing this code:

    HTML:

    <div id="page" class="page-content">
        ...         
    </div> 
    

    CSS:

    .page-content {    
    height: 100%;
    overflow: auto;}
    

    Javascript:

    • when keyborad is open

          window.addEventListener('native.keyboardshow', function (e) {
          var deviceHeight = window.innerHeight;
          var keyboardHeight = e.keyboardHeight;
          var deviceHeightAdjusted = deviceHeight - keyboardHeight;//device height adjusted
          deviceHeightAdjusted = deviceHeightAdjusted < 0 ? (deviceHeightAdjusted * -1) : deviceHeightAdjusted;//only positive number
          document.getElementById('page').style.height = deviceHeightAdjusted + 'px';//set page height
          document.getElementById('page').setAttribute('keyBoardHeight', keyboardHeight);//save keyboard height
      });
      
    • when keyboard is closed

          window.addEventListener('native.keyboardhide', function (e) {
          setTimeout(function () {
              document.getElementById('page').style.height = 100 + '%';//device  100% height
          }, 100);
      

    To provide a better user experience, add this code for all inputs

    var inputs = document.querySelectorAll('input');//select all input
    var n = inputs.length;
    for (var i = 0; i < n; i++) {
        var input = inputs[i];
        input.addEventListener('focus', function (e) {//add event focus
            var inp = this; 
           //wait 0.6 seconds to scroll down to the input has focus
            setTimeout(function () {
                try {
                    //if the keyboard is open
                    if (cordova.plugins.Keyboard.isVisible) {
                        var padding = 15;
                        var targetPosition = parseInt($$(inp).offset().top + padding);
                        var keyboardHeight = parseInt(document.getElementById('page').getAttribute('keyBoardHeight'));//get keyboard height   
    
                        //if the input is hidden by the keyboard,scroll to the input 
                        if (targetPosition >= keyboardHeight) {
                            padding *=5;
                            document.getElementById('page').scrollTop = targetPosition - padding;
                        }
                    }
                } catch (ex) {
                    alert(ex.message);
                }
            }, 600);
        }, true);
    
    0 讨论(0)
  • 2020-12-03 13:31

    My App uses the Android fullscreen / immersive mode. I have solved it by switching the the modes as soon as the keyboard appears/disappears.

    I have installed the cordova-plugin-fullscreen and ionic-plugin-keyboard plugins and added this code:

    document.addEventListener('deviceready', 
      function(){
        // disable immersive mode  on Android when keyboard is shown
            try {
          if (cordova.platformId == 'android') {
            AndroidFullScreen.immersiveMode(false, false);
            window.addEventListener('native.keyboardshow', function (e) {
              AndroidFullScreen.showSystemUI(false, false);
    
            });
            window.addEventListener('native.keyboardhide', function (e) {
              AndroidFullScreen.immersiveMode(false, false);
            });
          }
        } catch (error) {
          console.log('deviceready - ' + error);
        }
    }, false);
    
    0 讨论(0)
  • 2020-12-03 13:34

    I too had the same problem - the underlying problem it seems is you can't edit the androidManifest file with cordova Build. All you can do is edit the config.xml file which really only allows you to change a limited subset of settings. What I would like is to be able to change the windowSoftInputMode.

    I did find a solution to my problem. which was the keyboard appearing over fields at the bottom of the screen which I think is the same problem you're having. I have used the cordova 2.9.0 and cordova 3.6.0

    Solution 1: The solution I found was to change this setting in config.xml

    <preference name="fullscreen" value="false" />
    

    This does with that setting set to "false" instead of "true" - the page now scrolls up to reveal the field you're editing when the keyboard opens. (to be more accurate, I believe the viewport changes rather than scroll up. Hope you are right on your viewport part)

    Solution 2: Try remove or replace this line from config.xml

    <preference name="android-windowSoftInputMode" value="adjustResize|stateHidden" />
    

    as

    <preference name="android-windowSoftInputMode" value="stateVisible|adjustResize"/>
    

    instead. This works for me now.

    Solution 3: Try adding this style to your page

    <style> <item name="android:windowTranslucentStatus">true</item></style>
    

    EDIT:

    If your are using jQuery you can try that.

    $('input, textarea, button, a, select').off('touchstart mousedown').on('touchstart mousedown', function(e) {
        e.stopPropagation();
    });
    
    0 讨论(0)
  • 2020-12-03 13:34

    Just add following line to config.xml file, that's it..

    <preference name="android-windowSoftInputMode" value="stateVisible|adjustResize"/>
    
    0 讨论(0)
  • 2020-12-03 13:35

    I am using the Ionic Keyboard Plugin to detect when the keyboard is open and add necessary padding accordingly to the body:

    phonegap plugin add ionic-plugin-keyboard --save
    

    When the events fire, you can adjust the padding-bottom on the body to match the height of the keyboard.

    Then, in order to detect if the focused element is visible, you have to do the math and scroll the container if necessary. The final code I am using is the following:

    cordova.plugins.Keyboard.disableScroll(true);
    $$(window).on('native.keyboardshow', function(e) {
        $$('body').css('padding-bottom', e.keyboardHeight + 'px');
    
        var el = $$('input:focus, textarea:focus');
        var content = el.closest('.page-content');
        var offset = el.offset().top + content.scrollTop();
        /* 15 is an arbitrary value to add a bit of padding */
        var safeAreaHeight = el.outerHeight(true) + 15;
        var maxPosition = content.height() - safeAreaHeight;
        if (content.scrollTop() < (offset - maxPosition)) {
                content.scrollTop(offset - maxPosition);
        }
    
    });
    $$(window).on('native.keyboardhide', function(e) {
        $$('body').css('padding-bottom', 0);
    });
    

    The code makes use of Framework7 and its Dom7 library which is very similar to jQuery. It assumes the scrollable element is .page-content, but you can adjust it accordingly.

    You should leave the android-windowSoftInputMode preference at its default value.

    0 讨论(0)
提交回复
热议问题