2013-01-23 13 views
6

W mojej aplikacji Android użytkownik może przeglądać niektóre strony HTML za pomocą ViewPager, a użytkownik może dotknąć elementu, aby go podświetlić.Android - JavaScript: zdarzenie touchstart nie zostało uruchomione do momentu powiększenia lub przewinięcia strony

Problem polega na tym, że próbując uzyskać zdarzenie dotykowe za pomocą javascript za pomocą następującego kodu, elementFromPoint zwraca wartość null podczas nawigacji do nowej strony, ale po powiększeniu lub przewinięciu strony przez użytkownika działa poprawnie.

Znalazłem rejestr zdarzenia touchstart po powiększeniu lub przewiń stronę. tak to działa zaraz po tym, chociaż jest on zarejestrowany na $ (document) .ready()

 $(document).ready(function(){ 
      document.addEventListener("touchstart", touchstart, false);  
     });  

     function touchstart(e) {        
      var x = e.targetTouches[0].clientX; 
      var y = e.targetTouches[0].clientY;        
      el = document.elementFromPoint(x, y); 
      } 

dziękuję

Odpowiedz

7

zapisu następny kod w kodzie java po wywołaniu javascript:

myWebview.scrollTo(1, 0); 
    myWebview.scrollTo(0, 0); 

lub użyj funkcji powiększania, a następnie pomniejszanie:

myWebview.zoomIn(); 
    myWebview.zoomOut(); 
+0

Dziękuję, ten kod działa dobrze, ale dlaczego? –

+0

Czuje się dość hacky, ale działa. Przy okazji, jeśli animujesz swój WebView z poza ekranem, musisz uruchomić te linie kodu po zakończeniu animacji. Konfiguruję go w metodzie onAnimationEnd Animator.AnimatorListener() i działa świetnie. Potwierdziłem również, że działa nawet wtedy, gdy zawartość strony nie jest wystarczająco duża, aby wymagać przewijania. –

+0

Brian - czy pamiętasz, jeśli widok sieci był biały, jeśli nie czekałeś na zakończenie animacji i wywołałeś metody powiększania/pomniejszania? –

0

za pomocą rozwiązania Mohameda Abdela Latifa (oczywiście jest to er lame błąd WebView) poniżej to, co naprawiono dla mnie na Androida 4.1.2. Uwaga: testowałem to na Androidzie 4.4.2 i ten hack-to-fix-a-bug nie jest potrzebny.

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 

    final WebView myWebView = (WebView) findViewById(R.id.mywebview); 
    myWebView.setHorizontalScrollBarEnabled(false); 
    myWebView.getSettings().setJavaScriptEnabled(true); 
    myWebView.loadDataWithBaseURL("file:///android_asset/", YOUR_HTML_GOES_HERE, "text/html", "utf-8", null); 

    myWebView.setWebViewClient(new WebViewClient() 
    { 
     // overcome the ontouchstart registration bug ! 
     @Override 
     public void onPageFinished(WebView view, String url) 
     { 
      super.onPageFinished(view, url); 
      final WebView myWebView = (WebView) findViewById(R.id.mywebview); 
      myWebview.scrollTo(1, 0); 
      myWebview.scrollTo(0, 0); 
     } 
    }); 
} 
Powiązane problemy