내 안드로이드 앱의 JavaScript 함수에서 반환 문자열을 토스트하고 싶었습니다. 며칠 동안 몇 가지 코드를 검색하고 시도했지만 올바른 코드를 찾을 운이없는 것 같습니다.
다음은 문자열 값을 반환하기 위해 Android에서 호출하려는 JS 함수입니다.
function myFunction()
{
var str= document.getElementsByName('txt')[0].value;
window.android.myFunction(str);
}
MainActivity.java
//create interface
JsInterface jsInterface = new JsInterface();
wv.setWebViewClient(new WebViewClient());
wv.setWebChromeClient(new WebChromeClient());
wv.getSettings().setJavaScriptEnabled(true);
//add interface
wv.addJavascriptInterface(jsInterface, "android");//android is the keyword that will be exposed in js
//load file
wv.loadUrl("file:///android_asset/test.html");
Toast.makeText(getApplicationContext(), myFunction(), Toast.LENGTH_LONG);
}
//javascript interface
private class JsInterface{
public String myFunction(String msg){
return msg;
}
}
저는 이런 종류의 플랫폼과 Javascript의 초보자입니다. 대답 해주신 분들께 감사드립니다. 감사.
코드를 다음과 같이 변경해야한다고 생각합니다.
JavaScript 함수를 실행하여 WebViewClient.onPageFinished
문서가 실제로로드되었는지 확인하고이를 실행하려면 URL loadUrl()
과 함께 함수를 사용하십시오 javascript:
.
wv.setWebViewClient(new WebViewClient() {
@Override
void onPageFinished(WebView view, String url) {
view.loadUrl("javascript:myFunction();void(0);");
}
}
주석으로 노출하려는 Java 메서드에 @JavascriptInterface
주석 을 달고 ( void
실제로 JavaScript로 아무것도 반환하지 않으려는 경우) Toast.makeText()
내부에서 호출 하되 삽입 된 Java 메서드 때문에 UI 스레드로 전환해야합니다. 전용 백그라운드 스레드에서 실행 :
private class JsInterface {
private Context mContext;
JsInterface(Context context) {
mContext = context;
}
@JavascriptInterface
public void myFunction(String msg) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(mContext, msg, Toast.LENGTH_LONG);
}
});
}
}
그리고 JsInterface
생성시 응용 프로그램 컨텍스트를 전달하십시오 .
JsInterface jsInterface = new JsInterface(getApplicationContext());
또한라는 두 가지 기능이 있습니다 myFunction
주입 된 객체의 하나를 통해 사용할 수 : 귀하의 자바 스크립트를 android.myFunction()
, 당신은 자신을 정의 된 하나, 그냥으로 사용할 수 myFunction()
또는 window.myFunction()
. 혼동을 피하기 위해 실제로 다른 이름을 사용하는 것이 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다