2013-06-19 4 views
8

Mam CordovaWebView, który prezentuje niektóre formularze HTML. Kiedy koncentruję się na polu wprowadzania danych, pojawia się miękka klawiatura systemu Android, a dla niektórych pól, zgodnie z ich pozycją, staje się na wierzchu. Zasadniczo nie zmienia to rozmiaru widoku CordovaWebView.Miękka klawiatura systemu Android ukrywa dane wejściowe z CordovaWebView w trybie pełnoekranowym

Cokolwiek robię, nie mogę tego zmienić i mówi się, że jest to związane z faktem, że CordovaWebView działa w trybie pełnoekranowym.

Jak mogę to rozwiązać?

PS: czy to błąd?

Dziękuję wszystkim!

Odpowiedz

5

W rzeczywistości jest to dobrze znany błąd, jak powiedział @ użytkownik2493245. Ale znalazłem obejście, przynajmniej w odniesieniu do mojej konkretnej sprawy.

na WebView, po prostu sprawdź współrzędne widocznego obszaru widoku.

final View activityRootView = this.root; 
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    public void onGlobalLayout() { 
     Rect r = new Rect(); 
     //r will be populated with the coordinates of your view that area still visible. 
     activityRootView.getWindowVisibleDisplayFrame(r); 

     int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); 
     if(heightDiff != lastValue) { 
      if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... 
       appView.sendJavascript("onKeyBoardShow(" + r.bottom + ");"); 
      } else { 
       appView.sendJavascript("onKeyBoardHide();"); 
      } 
      lastValue = heightDiff; 
     } 
    } 
}); 

Jak widać, wysyłam te informacje do WebView. HTML, mam to na dwa sposoby, aby radzić sobie z problemem:

function onKeyBoardShow(bottom) { 
    var diff = ($('input[type=text]:focus').offset().top - bottom) + 50; 
    if(diff > 0) { 
     $('body').css("top", (diff * -1) + "px"); 
    } 
}; 

function onKeyBoardHide() { 
    $('body').css("top", "0px"); 
}; 

Zasadniczo onKeyBoardShow, robi się pole wprowadzania skoncentrowany i oblicza ilość pikseli, które będą konieczne, aby przenieść ciało, pozwalając użytkownikowi zobaczyć pole wejściowe. onKeyBoardHide, po prostu umieszcza ciało w pierwotnej pozycji.

PS: Działa to tylko wtedy, gdy ekran jest kierowany na devicedpi, ponieważ musimy zmodyfikować sposób, w jaki uzyskujemy różnicę w stosunku do rozdzielczości urządzenia.

PS2: Pierwsza ilość kodu nie jest moja, edytowałem ją tylko po to, aby zaspokoić moje potrzeby. Widziałem to na pytanie SO, ale niestety teraz nie mogę go znaleźć. Jeśli ją znajdę, opublikuję link tutaj.

+0

jak uzyskać "lastValue"? –

+0

@AnasAzeem, gdy onCreate(), i init 'lastValue = 0'. zapomniałem dodać go do przykładu. Twoje zdrowie! –

1

Mam ten sam problem i odkryłem, że jest to znany błąd.

Obejście problemu może polegać na tym, że piszesz wtyczkę, która wyłącza tryb pełnoekranowy tuż przed pojawieniem się softkeyboard i ponownie ją włącza.

+0

dziękuję za odpowiedź, ale znalazłem prostszy sposób, że będę pisać od razu. :) –

0

Usuń android:theme="@android:style/Theme.NoTitleBar.Fullscreen" z oczywistego i dodać te 2 linie kodu:

requestWindowFeature(Window.FEATURE_NO_TITLE); 
getWindow().addFlags(LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 

Upewnij się onCreate metoda wygląda następująco:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().addFlags(LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.yourLayout); 

     // Your code ... 
} 

i wszystko będzie działać: D.

+0

To nie działa !! –