일부 동적으로 생성 된 HTML (자바 스크립트도 실행 가능)을 표시하는 데 사용되는 WebView
구성 요소가 표시된 애플리케이션이 있습니다. WebView
에 사용할 수 있습니다. 페이지로드가 완료되면 내가 입력 텍스트 상자 중 하나의 포커스를 설정하려고 몇 페이지에 대한Android WebView - 자바 스크립트를 사용하여 HTML 필드 포커스 설정
- 하지 바디 onLoad()
을 통해, 대신 페이지를 완료 한 후 JS 호출 로딩 예에 의한 onPageFinished()
. 자바 스크립트의 대부분은
webview.loadURL("javascript:JSMethod();");
을 잘 실행하지만 내가하고 같은 전화를 사용할 때 document.getElementById('text1').focus()
- 커서가 요소에 도달 않습니다하지만 Soft Keyboard
이 튀어되지 않습니다. 페이지의 버튼에서 실행될 때 동일한 자바 스크립트 코드가 원하는 효과를냅니다. 텍스트 1에 커서를 넣고 Softkeyboard 팝업 -
나는 3 버튼
Focus Text1
이있는 소스 코드를 부착하고있다.Java Focus Text1
- Java를 호출하여 동일한 JS를 실행합니다. 커서 만 표시하고 키보드는 튀어 나오지 않습니다.Java Focus Text1 And Keyboard Open
- Java 및 강제 키보드에서 JS를 호출합니다.
내 이해 버튼/이벤트를 사용하여 브라우저에서 실행 여부 WebView.loadURL()
통해 자바로부터 전송로 JS 실행이 동일하게 작동한다는 것이다.
여기 Button#2
를 사용하는 경우
- 내가 모르는 뭔가가 내 쿼리입니까? 그게 내 현재 코드이며 커서가 설정되어 있지만 SoftKeyboard는 열리지 않는다는 것을 알 수 있습니다.
Button#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()를 사용하고 있다고 언급했을 때 WebView
이 onCreate()
메서드에서 초기화되었을 때이를 사용했습니다. 가장 큰 차이점은 자바 스크립트 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....
감사합니다. 나도 같은 문제가 있었지만이 솔루션은 안드로이드 3.2에서 나에게 도움이되지 못했다. 결국 필드에 실제 탭을 시뮬레이션 한 함수를 작성해야했습니다. 나는 당신의 솔루션이 왜 작동하지 않았는지 모르겠다. WebView는 단조로 가득합니다. – Pre101
나는 안드로이드 3.x를/4.x의에서이 코드를 테스트하지 않았다. 하지만 둘 중 하나에서이 샘플 프로그램을 실행하려고 시도 했습니까? – Swaroop
난 당신이 유형 = 번호 입력 실제로 숫자 키보드를 얻을 수 있는지 확인하기 위해이 방법을 사용할 수 있는지 알고 싶네요. 그것은 현재 포커스가있는 HTML 요소를 알 수 없기 때문에 지금까지 내가 점점 오전으로, InputMethodManager은 표준 키보드 레이아웃 (쿼티)를 열 수 있습니다. wv.requestFocus를 사용하는 것이 도움이되지 않았습니다. – Wytze