2011-04-14 26 views
14

Sadece dinamik olarak oluşturulmuş bazı HTML'leri (Javascript'i çalıştırabilir) görüntülemek için kullanılan, görünür bir WebView bileşenine sahip bir uygulamam var. WebView için etkinleştirildi. Sayfa yükleme bittikten sonra giriş metin kutularından birine odağını ayarlamak çalışıyorum birkaç sayfaları içinAndroid WebView - HTML Alanını Ayarlama Javascript kullanarak ayarlama

- değil Gövde onLoad() yoluyla, ancak bunun yerine sayfa bittikten sonra JS çağrısı yükleme yani içinde tarafından onPageFinished(). javascript çoğu

webview.loadURL("javascript:JSMethod();"); 

ince yürütür Ama yapmam gereken aynı çağrıyı kullandığınızda bir document.getElementById('text1').focus() - imleç elemanı ulaşmak yok ama Soft Keyboard dışarı pop olmaz. Sayfadaki bir düğmeden yürütüldüğünde aynı javascript kodu istenen etkiye sahiptir. text1 imleci koyun ve SoftKeyboard açılır -

Ben 3 düğmelerini

  1. Focus Text1 sahiptir kaynak kodu ekleme.
  2. Java Focus Text1 - Aynı JS'yi yürütmek için Java'yı çağırır. Sadece imleci orada gösterir ve klavyenin dışına çıkmaz
  3. Java Focus Text1 And Keyboard Open - Java ve Forces Keyboard'dan JS'yi açar.

Anladığım kadarıyla, JS yürütme işlemi, tarayıcıdan bir düğme/olay kullanarak veya Java'dan WebView.loadURL() aracılığıyla gönderilip gerçekleştirilmediyse, aynı şekilde çalışmalıdır.

İşte Button#2 kullanırken

  1. bir şey eksik benim Sorguları var? İşte bu benim geçerli kodumdur ve sadece imlecin ayarlandığını görüyorum ancak SoftKeyboard açılmıyor.
  2. Mantığı Button#3'da yazıldığı gibi kullandığımda, bazen imleci alan üzerinde görmüyorum, ancak bana istenen etkiyi veriyor ve açılır klavyede bir şey yazdığımda imleç görünür hale geliyor.
  3. Button#2'da gördüğüm davranış Android JS uygulamasında bir hata olabilir mi? Ya da WebView'un odağı olmaması sadece imlecin görüntülenmesinin nedeni olabilir mi? Ben de webview.requestFocus() denedim - requestFocusOnTouch() yazamıyorum çünkü sahip olduğum tek Görünüm ve otomatik olarak odaklanmasını bekliyorum.

davranışı tanıtıyor Java kodu

import android.app.Activity; 
    import android.content.Context; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.inputmethod.InputMethodManager; 
    import android.webkit.JsResult; 
    import android.webkit.WebChromeClient; 
    import android.webkit.WebView; 
    import android.webkit.WebViewClient; 

    public class WebViewProjectTestJSHTMLFocusActivity extends Activity { 

     Activity _current = null; 
     WebView wv = null; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      _current = this; 
      //setContentView(R.layout.main); 
      String data = "<html><body>" + 
           "<script>function focusser() { document.getElementById(\"text1\").focus(); } </script>" + 
           "<script>function javaFocusser() { javautil.javaFocus(false); } </script>" + 
           "<script>function javaFocusserKeyboard() { javautil.javaFocus(true); } </script>" + 
           "Text 1<input type='text' id='text1'/><br/>" + 
           "Text 2<input type='text' id='text2'/><br/>" + 
           "<input type='button' value='Focus Text1' onClick='focusser()'/>" + 
           "<input type='button' value='Java Focus Text1' onClick='javaFocusser()'/>" + 
           "<input type='button' value='Java Focus Text1 And Keyboard Open' onClick='javaFocusserKeyboard()'/>" + 
          "</body></html>"; 
      wv = new WebView(this); 
      wv.getSettings().setJavaScriptEnabled(true); 

      // Set some HTML 
      wv.loadDataWithBaseURL("file:///android_asset/", data, "text/html", "UTF-8", null); 

      // Call back required after page load finished 
      wv.setWebViewClient(new CustomWebViewClient()); 

      // Enable Alert calls 
      wv.setWebChromeClient(new CustomWebChromeClient()); 

      // For JS->Java calls 
      wv.addJavascriptInterface(this, "javautil"); 

      setContentView(wv); 
     } 


     /** 
     * Calls the same javascript and forces the keyboard to open 
     */ 
     public void javaFocus(final boolean shouldForceOpenKeyboard) { 

      Thread t = new Thread("Java focusser thread") { 
       public void run() { 
        wv.loadUrl("javascript:focusser();"); 
        if(shouldForceOpenKeyboard) { 
         InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
         mgr.showSoftInput(wv, InputMethodManager.SHOW_IMPLICIT); 
        } 
       } 
      }; 

      // Run on the View Thread. 
      _current.runOnUiThread(t); 
     } 

     /** 
     * Calls focus method after the page load is complete. 
     */ 
     final class CustomWebViewClient 
     extends WebViewClient { 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       // javaFocus(true); 
       Log.d("TestExamples", "focusser call complete"); 
      } 
     } 

     final class CustomWebChromeClient 
     extends WebChromeClient { 
      @Override 
      public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
       Log.d("TestExamples", "JS Alert :: " + message); 
       return false; 
      } 
     } 
    } 

Çözüm Güncelleme 24-06-2011 sadece gerçek JS odak çağrısından önce wv.requestFocus(View.FOCUS_DOWN) kullanmak gerekir, bu işi yapmak için olduğunu. Yukarıdaki javaFocus() yöntemini aşağıdaki doğru sürüme geçirdim. Daha önce, requestFocus() kullandığımı belirttiğimde, WebViewonCreate() yönteminde başlatıldığında bunu kullanıyordum. Birincil fark şu anda Javascript document.getElementById("text1").focus(); yürütülmeden önce her defasında odaklanmak için WebView'u zorluyoruz.Ayrıca

public void javaFocus(final boolean shouldForceOpenKeyboard) { 
    Thread t = new Thread("Java focusser thread") { 
     public void run() { 
      wv.requestFocus(View.FOCUS_DOWN); 
      wv.loadUrl("javascript:focusser();"); 
      if(shouldForceOpenKeyboard) { 
       InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
       mgr.showSoftInput(wv, InputMethodManager.SHOW_IMPLICIT); 
      } 
     } 
    }; 

    // Run on the View Thread. 
    _current.runOnUiThread(t); 
} 

bu konu, ben Görüntülenen WebView'da 5 saniye sonra javaFocus() başlatmak için bir arka plan iş parçacığı kullanıyorum dokunma vb yoluyla tetiklenen çünkü odak sabit değildi emin olmak için. Değiştirilen onCreate() aşağıda.

..... More onCreate code before.... 
// Enable Alert calls 
wv.setWebChromeClient(new CustomWebChromeClient()); 

// For JS->Java calls 
wv.addJavascriptInterface(this, "javautil"); 

setContentView(wv); 

new Thread("After sometime Focus") { 
    public void run() { 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     javaFocus(true); 
    } 
}.start(); 
.... onCreate() ends after this.... 
+0

Ayrıntılı açıklama için teşekkürler. Aynı problem vardı ama bu çözüm benim için Android 3.2'de çalışmadı. Sonunda, sahada gerçek bir dokunuşu simüle eden bir işlev yazmak zorunda kaldım. Çözümün neden işe yaramadığını anlamıyorum. WebView sadece tuhaflarla dolu. – Pre101

+0

Bu kodu Android 3.x/4.x'te test etmedim. Ama bu örnek programı her ikisinde de çalıştırmayı denediniz mi? – Swaroop

+0

Bir tür = sayı girdisinin aslında sayısal bir klavye aldığından emin olmak için bu yaklaşımı kullanıp kullanamayacağınızı bilmek isterim. Elde ettiğim kadarıyla, InputMethodManager sadece standart klavye düzenini (Qwerty) açabiliyor, çünkü hangi HTML elemanının odağı olduğunu bilmiyor. Wv.requestFocus kullanımı yardımcı olmadı. – Wytze

cevap

5

Web görünümünün uygulama odağı olmaması olabilir. Yürütmeyi deneyin;

wv.requestFocus(View.FOCUS_DOWN); 
+2

Bu aslında işe yaradı. Hile, Focus için istekte bulunmadan önce 'wv.requestFocus (View.FOCUS_DOWN); Sorunun değiştirilmesi, kodun iyi biçimlendirilmesi için. – Swaroop

+0

Yardım etmekten mutluluk duyuyorum! :) – Jivings

+0

Herkes doz dozu biliyor wv.requestFocus (View.FOCUS_DOWN) ios üzerinde çalışıyor? Teşekkürler – star

İlgili konular