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.
jak uzyskać "lastValue"? –
@AnasAzeem, gdy onCreate(), i init 'lastValue = 0'. zapomniałem dodać go do przykładu. Twoje zdrowie! –