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();