WebView возвращает bad window.innerHeight
У меня есть приложение, которое использует Android WebView, а также некоторый JavaScript. Когда мой WebViewClient вызывает onPageFinished()
, я предупреждаю свой JavaScript, чтобы запустить метод инициализации. Мой JavaScript включен и загружен, прежде чем я удалю onPageFinished()
.
В этом методе JavaScript я использую window.innerWidth
. Однако возвращаемое значение всегда неверно и всегда одинаково. Независимо от моей ориентации, она сообщает, что внутренняя ширина равна 320, а внутренняя высота - 240. (Правильные значения ширины для портрета и пейзажа равны соответственно 360 и 598.) В любом другом месте я получаю доступ к window.innerWidth
или window.innerHeight
в JavaScript, который дает мне точное число.
Что более озадачивает то, что если я проверю высоту или ширину WebView непосредственно в моем вызове onPageFinished()
, используя
int height = view.getHeight();
int width = view.getWidth();
то он всегда возвращается правильно (хотя он возвращает точные номера пикселей, а не DIP). Это заставляет меня думать, что все закончило загрузку с помощью WebView, и поэтому у меня не должно быть никаких проблем в моем JavaScript.
Любые идеи относительно того, что происходит?
Спасибо заранее!
Ответы
Ответ 1
Это связано с тем, что Javascript выполняется перед инициализацией, связанной с WebView View. И Android WebView возвращает значение по умолчанию 320x240 для JS.
Выполните свою JS через некоторое время, как это.
function go() {
int height = view.getHeight();
int width = view.getWidth();
};
window.setTimeout(go, 300);
Ответ 2
В конце я использовал значения из webView.getHeight()
и webView.getWidth()
, скорректировал их для плотности экрана и передал их в качестве аргументов в javascript-метод через webView.loadUrl()
. Это был единственный способ, которым я мог быть уверен, что получаю правильные ценности.
Выполнение того, что было предложено в комментариях выше, проверка ширины 320, а высота 240 будет отлично работать... пока вы не запустите на устройстве с такими точными размерами.
Ответ 3
После некоторого чтения произошло другое решение. в java-коде мы можем использовать
new Handler().post(new Runnable(){
@Override
public void run(){
webview.loadUrl("...")
}
});
добавьте его в QueueMessage и задерживайте js для выполнения, и он работает.
Ответ 4
Я использовал это:
Java код Activity
:
webView.addJavascriptInterface(new WebAppInterface(this), "Android");
...
public class WebAppInterface {
Context mContext;
WebAppInterface(Context c) {
mContext = c;
}
public int getWinHeight() {
return webView.getHeight();
}
}
Код JS:
var winHeight = Android.getWinHeight();