plugin android angularjs cordova view keyboard

plugin - Ver redibujado en la posición incorrecta después de cerrar el teclado-Cordova/PhoneGap-Android



config.xml phonegap (4)

Tengo una aplicación de Cordova (usando el framework angularjs), aquí está mi vista:

Cuando enfoco una entrada que requiere que la vista se mueva hacia arriba para mantener la entrada visible cuando el teclado (en pantalla) se muestra así:

Cuando cambio el enfoque de la entrada a otra parte (desenfoque), el teclado se cierra (como debería) pero vuelve a dibujar la vista en la posición incorrecta:

Cuando inspecciono con Chrome, muestra todos los elementos en la posición que deberían estar y no donde están en la pantalla:

No tengo ni idea de qué está causando este error, intenté volver a dibujar la vista en el método onDraw , lo que onDraw infinitamente la vista para ver si eso lo solucionaba, pero fue en vano. ¿Algunas ideas?

Detalles adicionales
Versión de Cordova: 3.5.0-0.2.4
Dispositivo: Nexus 10 - Android 4.4.4


Pude solucionar el problema en nuestra aplicación agregando el siguiente ''truco'' a mi código de botón de envío.

$(''html, body'').scrollTop(0); $(''#usernamefield'').blur(); $(''#passwordfield'').blur(); $(''#loginform_submit'').blur();

Así que obligué a los elementos html y body a desplazarse hacia la parte superior y también me aseguré de que ningún elemento tuviera el foco, por lo que el teclado desaparecería antes de continuar.

Espero que esto te ayude también.

/ Mika


He encontrado un fix / hack, no es genial, sin embargo es mejor que nada.

Al ocultar la etiqueta html y volver a mostrarla, vuelve a dibujar la vista correctamente.

fixAndroidKitkatDisplayBug: function () { $(document).on(''blur'', ''input'', function () { var htmlTags = document.getElementsByTagName(''html''); var html = htmlTags[0]; html.style.display = ''none''; html.offsetHeight; // no need to store this anywhere, the reference is enough html.style.display = ''block''; }); }

Luego en el index.js, después de "onDeviceReady" llamo a este método como tal

setTimeout(function (){ if (typeof(device) != ''undefined'' && device.platform && device.platform == "Android" && device.version && parseFloat(device.version) == 4.4) { fixAndroidKitkatDisplayBug(); } }, 100);

(Para mí, necesitaba el setTimeout para que se definiera el dispositivo)


Tuve el mismo problema. Pero resuelvo usando este código jQuery.

$(''input'').on(''blur'',function(){ document.body.scrollTop = 0; })

Me funcionó


Me enfrenté a un problema idéntico con Sencha Touch en Android 4.4.2, y finalmente esto lo hizo funcionar:

if (Ext.os.is(''Android'')) { window.repaint = {}; //dirty fix for screen is scrolling down when user hides keyboard window.onresize = function() { var repaintFn = function() { Ext.defer(function() { var body = document.body; window.repaint.isRepainting = false; if (window.repaint.counter < 3) { window.repaint.counter++; body.style.overflow = (body.style.overflow == ''hidden'') ? ''auto'' : ''hidden''; repaintFn.call(this); } }, 1500, this); }; if (!window.repaint.isRepainting) { repaintFn.call(this); window.repaint = { counter: 0, isRepainting: true }; } };

}

La línea que hace el truco es:

body.style.overflow = (body.style.overflow == ''hidden'') ? ''auto'' : ''hidden'';

El resto del código consiste en llamar a la misma función 4 veces con un retraso, para garantizar que funcione incluso en dispositivos de bajo rendimiento, donde puede haber un desfase entre el disparo del evento de cambio de tamaño y la pantalla que realmente se desplaza hacia abajo.