Mittwoch, 16. Dezember 2015

Elemente finden, die einen horizontalen Scrollbalken verursachen

Developer Tools => Console öffnen.

Folgendes Skript pasten:

var docWidth = document.documentElement.offsetWidth;
[].forEach.call(
  document.querySelectorAll('*'),
  function(el) {
    if (el.offsetWidth > docWidth) {
      console.log(el);
    }
  }
);


Jetzt erscheinen die Elemente die untersucht werden müssen.

Dienstag, 19. Mai 2015

Mehrere OnPageStarted und OnPageFinshed Aufrufe bei Android Webview Apps behandeln.

Folgendes Problem bei einer WebView - Hybrid - Android - App: Wenn man eine URL lädt, setzt man meistens einen Loading-Dialog ein, damit der Nutzer weiß, dass er kurz warten muss.
In meinem Fall ist das ein Splash-Screen bestehend aus einem zweiten WebView. Das ist aber irrelevant.
Das Problem ist, dass es oft dazu kommt, dass mehrere "OnPageStarted" und "OnPageFinished" nacheinander oder parallel gestartet werden. Zum Beispiel bei Weiterleitungen, Iframes, Ajax-Calls usw. Zum Beispiel bei einem Facebook-API-Login sieht das dannziemlich doof aus.

Meine Lösung: Im OnPageFinished - Handler habe ich einen 500ms delay eingebaut. Nach den 500ms wird nachgesehen, ob ein "neuerer" "OnPageStart" vorhanden ist, Wenn ja, dann beende den Loading-Screen nicht, sondern warte bis der nächste "OnPageFinshed" kommt.



myWebView.setWebViewClient(new WebViewClient() {
        boolean loadingFinished = true;
        boolean redirect = false;

        long last_page_start;
        long now;

        // Load the url
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (!loadingFinished) {
                redirect = true;
            }

            loadingFinished = false;
            view.loadUrl(url);
            return false;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.i("p","pagestart");
            loadingFinished = false;
            last_page_start = System.nanoTime();
            show_splash();
        }

        // When finish loading page
        public void onPageFinished(WebView view, String url) {
            Log.i("p","pagefinish");
            if(!redirect){
                loadingFinished = true;
            }
            //call remove_splash in 500 miSec
            if(loadingFinished && !redirect){
                now = System.nanoTime();
                new android.os.Handler().postDelayed(
                        new Runnable() {
                            public void run() {
                                remove_splash();
                            }
                        },
                        500);
            } else{
                redirect = false;
            }
        }
        private void show_splash() {
            if(myWebView.getVisibility() == View.VISIBLE) {
                myWebView.setVisibility(View.GONE);
                myWebView_splash.setVisibility(View.VISIBLE);
            }
        }
        //if a new "page start" was fired dont remove splash screen
        private void remove_splash() {
            if (last_page_start < now) {
                myWebView.setVisibility(View.VISIBLE);
                myWebView_splash.setVisibility(View.GONE);
            }
        }

});