2013-06-02 8 views
13

Quando mi concentro su un campo modulo nella parte inferiore della vista iScroll, non scorre verso l'alto/porta il campo focalizzato sopra il softkeyboad. Qualche idea? Grazie!Come portare il campo focalizzato nella vista utilizzando iscroll e Android WebView

field field

Questo è il progetto Android. https://dl.dropboxusercontent.com/u/75818136/webkitdemo.zip

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> 
<title>iScroll demo: simple</title> 

<style type="text/css" media="all"> 
body,ul,li { 
    padding:0; 
    margin:0; 
    border:0; 
} 

body { 
    font-size:12px; 
    -webkit-user-select:none; 
    -webkit-text-size-adjust:none; 
    font-family:helvetica; 
} 

#header { 
    position:absolute; z-index:2; 
    top:0; left:0; 
    width:100%; 
    height:45px; 
    line-height:45px; 
    background-color:#d51875; 
    background-image:-webkit-gradient(linear, 0 0, 0 100%, color-stop(0, #fe96c9), color-stop(0.05, #d51875), color-stop(1, #7b0a2e)); 
    background-image:-moz-linear-gradient(top, #fe96c9, #d51875 5%, #7b0a2e); 
    background-image:-o-linear-gradient(top, #fe96c9, #d51875 5%, #7b0a2e); 
    padding:0; 
    color:#eee; 
    font-size:20px; 
    text-align:center; 
} 

#header a { 
    color:#f3f3f3; 
    text-decoration:none; 
    font-weight:bold; 
    text-shadow:0 -1px 0 rgba(0,0,0,0.5); 
} 

#footer { 
    position:absolute; z-index:2; 
    bottom:0; left:0; 
    width:100%; 
    height:48px; 
    background-color:#222; 
    background-image:-webkit-gradient(linear, 0 0, 0 100%, color-stop(0, #999), color-stop(0.02, #666), color-stop(1, #222)); 
    background-image:-moz-linear-gradient(top, #999, #666 2%, #222); 
    background-image:-o-linear-gradient(top, #999, #666 2%, #222); 
    padding:0; 
    border-top:1px solid #444; 
} 

#wrapper { 
    position:absolute; z-index:1; 
    top:45px; bottom:48px; left:0; 
    width:100%; 
    background:#aaa; 
    overflow:auto; 
} 

#scroller { 
    position:absolute; z-index:1; 
/* -webkit-touch-callout:none;*/ 
    -webkit-tap-highlight-color:rgba(0,0,0,0); 
    width:100%; 
    padding:0; 
} 

#scroller ul { 
    list-style:none; 
    padding:0; 
    margin:0; 
    width:100%; 
    text-align:left; 
} 

#scroller li { 
    padding:0 10px; 
    height:40px; 
    line-height:40px; 
    border-bottom:1px solid #ccc; 
    border-top:1px solid #fff; 
    background-color:#fafafa; 
    font-size:14px; 
} 
</style> 

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript" src="iscroll.js"></script> 

</head> 
<body> 

<div id="header"><a href="http://cubiq.org/iscroll">iScroll</a></div> 
<div id="wrapper"> 
    <div id="scroller"> 
     <ul id="thelist"> 
      <li>Pretty row 1</li> 
      <li>Pretty row 2</li> 
      <li>Pretty row 3</li> 
      <li>Pretty row 4</li> 
      <li>Pretty row 5</li> 
      <li>Pretty row 6</li> 
      <li>Pretty row 7</li> 
      <li>Pretty row 8</li> 
      <li>Pretty row 9</li> 
      <li>Pretty row 10</li> 
      <li>Pretty row 11</li> 
      <li>Pretty row 12</li> 
      <li>Pretty row 13</li> 
      <li>Pretty row 14</li> 
      <li>Pretty row 15</li> 
      <li>Pretty row 16</li> 
      <li>Pretty row 17</li> 
      <li>Pretty row 18</li> 
      <li>Pretty row 19</li> 
      <li>Pretty row 20</li> 
      <li>Pretty row 21</li> 
      <li>Pretty row 22</li> 
      <li>Pretty row 23</li> 
      <li>Pretty row 24</li> 
      <li>Pretty row 25</li> 
      <li>Pretty row 26</li> 
      <li>Pretty row 27</li> 
      <li>Pretty row 28</li> 
      <li>Pretty row 29</li> 
      <li>Pretty row 30</li> 
      <li>Pretty row 31</li> 
      <li>Pretty row 32</li> 
      <li>Pretty row 33</li> 
      <li>Pretty row 34</li> 
      <li>Pretty row 35</li> 
      <li>Pretty row 36</li> 
      <li>Pretty row 37</li> 
      <li>Pretty row 38</li> 
      <li>Pretty row 39</li> 
      <li><form><input type="text" value="hey" spellcheck="false"></form></li> 
     </ul> 
    </div> 
</div> 
<div id="footer"></div> 

<script> 

var myScroll; 
function loaded() { 
    myScroll = new iScroll('wrapper'); 
} 

document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false); 
document.addEventListener('DOMContentLoaded', function() { setTimeout(loaded, 200); }, false); 
window.addEventListener("resize", function() { 
    console.error("=------======-=-=-=="); 
}, false); 


</script> 

</body> 
</html> 
+0

Come su questo link. http://stackoverflow.com/questions/7026854/textbox-hidden-below-keyboard-in-android-webview –

+0

non funzionerà. Ho provato questo: P –

risposta

7

Ho finalmente trovato la soluzione alla mia domanda. A proposito, questa soluzione sarà nel mio libro che verrà pubblicato a breve. Volevo solo condividerlo con la comunità degli sviluppatori.

Prima di tutto, iscroll dovrebbe occuparsi di questo problema per noi, ma in qualche modo no.

Inoltre, penso che ci sia un bug nell'API Android. Quando utilizzo la modalità a schermo intero (in manifest o programmaticamente), l'evento "Resize" non viene attivato in WebView. Non ho idea del perché. Ho già segnalato questo bug al team di Android. Se sai perché questo accade, ti preghiamo di farcelo sapere qui. Grazie.

android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 

// or 

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

ecco la soluzione:

ho rimosso la modalità a schermo intero. Invece, ho usato res/values/style.xml, requestWindowFeature(android.view.Window.FEATURE_NO_TITLE); e android:theme="@style/Theme" nell'applicazione per rimuovere il titolo nativo dell'applicazione. Questa soluzione funziona anche quando si verifica l'orientamento.

Quindi, utilizzando l'evento "focus", ho catturato quale elemento ha un focus.

var $elm; 

$('input, textarea').bind('focus', function(e) { 
    console.error("onFocus"); 
    $elm = $(this); 
}); 

Quindi, l'utilizzo di "ridimensionare" evento, ho rinfrescato l'oggetto iscroll e poi scorrere fino al $ olmo.

$(window).bind('resize', function() { 
    console.error("onResize"); 
    if (myScroll !== undefined) { 
     setTimeout(function() { 
      myScroll.refresh(); 
      myScroll.scrollToElement($elm[0], 200); 
     }, 100); 
    } 
}); 

This is the answer to my question, WebKitDemo2.zip

+0

Il link non è più valido. Per favore, aggiorna il link o spiega come usare la tua soluzione. –

2

Non sono sicuro se questa è una buona risposta per la tua domanda. Ho già affrontato lo stesso problema con soft keyboard & iscroll in un dispositivo POS. Per risolvere questo problema, ho eseguito un lavoro STUPID.

Passi che ho fatto.

supponga è stato collegato iScroll come questo

iScrollObj = new iScroll ('id');

  1. io aggiungere un involucro div vuoto all'interno del contenitore di scorrimento all'ultimo se ho ingresso.
  2. Quando elemento input arrivare fuoco, ma prima tastiera apre a calcolare la posizione del campo di input (pi) e l'altezza di ingresso (hi)
  3. ottengo l'altezza dello schermo (hs), altezza della tastiera (hk)
  4. Utilizzando hs, hk, hi e pi Avevo calcolato un'altezza per svuotare il wrapper div e assegnarlo.
  5. per evitare delusioni che avevo usato la funzione iScrollObj.refresh() chiamata indietro. (Perché avevo dinamicamente assegnare altezza div involucro, iScroll qualche risposta corretta per la regolazione dinamica, ma a volte non riesce)
  6. Poi avevo usato iScrollObj.scrollTo(x, y, time) funzione di callback iScroll a muoversi l'input up
  7. Quando nascondo la tastiera imposto l'altezza del wrapper div vuoto a 0
  8. Ora è necessario ripristinare. iScrollObj.refresh() e iScrollObj.scrollTo(x, y, time)

Ancora è possibile utilizzare iScrollObj.scrollToElement(element, time) ma penso che questo è più lavoro. Poiché deve essere lo CSS selector di un elemento in cui iScroll scorre automaticamente fino a quell'elemento in cui visualizza quell'elemento nella posizione superiore nella vista. Significa che nella schermata che hai allegato ti verrà detto se utilizzi lo CSS selector dello Pretty row 34, quindi verrà visualizzato da Pretty row 34 verso il basso.

Nota

Soft keyboard che io uso è sviluppato da me (Si tratta di un plugin per jQuery) quindi ero in grado di implementare tutte le funzioni di callback richieste. iScroll fornisce già molte funzioni di callback.

Pertanto sono stato in grado di completare il mio compito e funziona correttamente senza alcun problema come previsto.

Non conosco i vincoli che hai. Ho appena condiviso lo STUPID con quello che ho fatto.

Perdonami se questa non è una soluzione adeguata a te.

Grazie.

+0

Onestamente, non sto cercando un hack. Anche se questo potrebbe funzionare, sto cercando una soluzione intuitiva. È anche possibile che gli esempi di iScroll utilizzino 'position: absolute;' di cui non sono fan. È probabile che il problema risieda anche nei CSS. - nizam – Nizzy

+0

@Nizzy: Sì, so che la mia soluzione è intuitiva. Se trovi una soluzione, aggiornala qui, quindi in futuro potrebbe aiutarmi ad affrontare queste situazioni. Ho provato molti modi per trovare la soluzione, quindi ho usato questo hacking .. :) –