2011-04-14 2 views
14

일부 동적으로 생성 된 HTML (자바 스크립트도 실행 가능)을 표시하는 데 사용되는 WebView 구성 요소가 표시된 애플리케이션이 있습니다. WebView에 사용할 수 있습니다. 페이지로드가 완료되면 내가 입력 텍스트 상자 중 하나의 포커스를 설정하려고 몇 페이지에 대한Android WebView - 자바 스크립트를 사용하여 HTML 필드 포커스 설정

- 하지 바디 onLoad()을 통해, 대신 페이지를 완료 한 후 JS 호출 로딩 예에 의한 onPageFinished(). 자바 스크립트의 대부분은

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

을 잘 실행하지만 내가하고 같은 전화를 사용할 때 document.getElementById('text1').focus() - 커서가 요소에 도달 않습니다하지만 Soft Keyboard이 튀어되지 않습니다. 페이지의 버튼에서 실행될 때 동일한 자바 스크립트 코드가 원하는 효과를냅니다. 텍스트 1에 커서를 넣고 Softkeyboard 팝업 -

나는 3 버튼

  1. Focus Text1이있는 소스 코드를 부착하고있다.
  2. Java Focus Text1 - Java를 호출하여 동일한 JS를 실행합니다. 커서 만 표시하고 키보드는 튀어 나오지 않습니다.
  3. Java Focus Text1 And Keyboard Open - Java 및 강제 키보드에서 JS를 호출합니다.

내 이해 버튼/이벤트를 사용하여 브라우저에서 실행 여부 WebView.loadURL() 통해 자바로부터 전송로 JS 실행이 동일하게 작동한다는 것이다.

여기 Button#2를 사용하는 경우

  1. 내가 모르는 뭔가가 내 쿼리입니까? 그게 내 현재 코드이며 커서가 설정되어 있지만 SoftKeyboard는 열리지 않는다는 것을 알 수 있습니다.
  2. Button#3로 작성된 논리를 사용하면 필드에 커서가 표시되지 않지만 원하는 효과를 얻을 수 있으며 팝업 된 키보드에 내용을 입력 할 때 커서가 표시됩니다.
  3. Button#2에 표시되는 동작이 Android JS 실행의 버그 일 수 있습니까? 또는 WebView에 커서 만 표시되는 이유가 무엇입니까? 나는 또한 webview.requestFocus()을 시도했다 - 나는 그것이 가지고 있고 그것이 자동으로 집중 될 것을 기대하고 있기 때문에 requestFocusOnTouch()을 쓸 수 없다.

동작을 데모 버튼 자바 코드는

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; 
      } 
     } 
    } 

솔루션 업데이트 24-06-2011 당신은 실제 JS 초점 호출하기 전에 wv.requestFocus(View.FOCUS_DOWN)를 사용할 필요가,이 일을하는 것입니다. 위의 javaFocus() 방법을 올바른 버전으로 수정했습니다. 이전에 requestFocus()를 사용하고 있다고 언급했을 때 WebViewonCreate() 메서드에서 초기화되었을 때이를 사용했습니다. 가장 큰 차이점은 자바 스크립트 document.getElementById("text1").focus();이 실행되기 바로 전에 매번 WebView에 포커스를 가져야한다는 것입니다.또한

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

이 문제가, 내가 표시 웹보기 5 초 후에 javaFocus()를 시작하는 백그라운드 스레드를 사용하고 터치 등을 통해 트리거 포커스 때문에 고정되지 않았 음을 확인합니다. 수정 된 onCreate()은 다음과 같습니다.

..... 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

감사합니다. 나도 같은 문제가 있었지만이 솔루션은 안드로이드 3.2에서 나에게 도움이되지 못했다. 결국 필드에 실제 탭을 시뮬레이션 한 함수를 작성해야했습니다. 나는 당신의 솔루션이 왜 작동하지 않았는지 모르겠다. WebView는 단조로 가득합니다. – Pre101

+0

나는 안드로이드 3.x를/4.x의에서이 코드를 테스트하지 않았다. 하지만 둘 중 하나에서이 샘플 프로그램을 실행하려고 시도 했습니까? – Swaroop

+0

난 당신이 유형 = 번호 입력 실제로 숫자 키보드를 얻을 수 있는지 확인하기 위해이 방법을 사용할 수 있는지 알고 싶네요. 그것은 현재 포커스가있는 HTML 요소를 알 수 없기 때문에 지금까지 내가 점점 오전으로, InputMethodManager은 표준 키보드 레이아웃 (쿼티)를 열 수 있습니다. wv.requestFocus를 사용하는 것이 도움이되지 않았습니다. – Wytze

답변

5

웹 뷰에는 응용 프로그램 포커스가 없을 수 있습니다. 실행 해보십시오. 철저한 설명은

wv.requestFocus(View.FOCUS_DOWN); 
+2

이것은 실제로 효과가있었습니다. 바로 초점이 요청하기 전에', 비결은'wv.requestFocus (View.FOCUS_DOWN)를 사용하는 것입니다. 코드 형식이 올바른지 확인하려면 질문 수정 – Swaroop

+0

도와 드리겠습니다! :) – Jivings

+0

사람이 iOS의 대답 wv.requestFocus (View.FOCUS_DOWN) 작업 선량 아는 사람? 감사 – star

관련 문제