혼합 App 의 개발은 새로운 것이 아니며, 원시와 H5 간의 상호 작용이 매우 중요하다. 안드로이드는 어떻게 H5 와 상호 작용합니까?
1, webView 로드 페이지
Android 에서 html 페이지는 webView 를 통해 로드되며 HTML 파일의 위치에 따라 다르게 쓰여진다는 것을 잘 알고 있습니다.
//예를 들어 자산 폴더 아래에 test.html 페이지를 로드합니다.
Mwebview.load URL ("file:///Android _ asset/test.html")
//예: 웹 페이지 로드
MWebView.loadUrl ("")
MWebView.loadUrl () 만 호출하여 로드하는 경우 페이지에서 링크를 클릭하면 페이지가 휴대폰의 기본 브라우저에서 열립니다. 그런 다음 응용 프로그램에서 페이지를 열려면 setWebViewClient 를 설정해야 합니다.
Mwebview.setwebview client (new webview client () {
@ 덮어쓰기
Public boolean should override URL loading (webview 뷰, 문자열 URL ){
Mwebview.loadurl (URL);
True 를 반환합니다
}
}
});
2.Android 는 Java 를 통해 HTML 페이지에서 로컬로 JavaScript 메소드를 호출합니다.
Js 메소드를 호출하려면 webView 에서 이를 지원하도록 해야 합니다.
Websettings websettings = mwebview.getsettings ();
//호출 가능한 js 메소드로 설정됩니다.
Websettings.set JavaScript enabled (true);
호출되는 js 메서드가 반환 값을 반환하지 않으면 mwebview.loadurl ("JavaScript: do ()") 을 직접 호출할 수 있습니다. 여기서 do 는 js 의 방법입니다. 반환 값이 있는 경우 mWebView.evaluateJavascript () 메서드를 호출할 수 있습니다.
Mwebview.evaluatejavascript ("sum (1,2)", new ValueCallback & lt 문자열 & gt() {
@ 덮어쓰기
Public void onReceiveValue (문자열 값) {
Log.e (태그, "onreceivevaluevalue ="+value ");
}
});
Js 코드는 다음과 같습니다.
& lt scripttype = "text/JavaScript" >
Sum(a 함수 (a, b ){
A+b 를 반환합니다.
}
함수 do(){
Document.getelementbyid ("p") 입니다. Innerhtml = "hello world";
}
& lt/스크립트 >
2.js 가 안드로이드의 로컬 Java 메소드를 호출합니다.
Android4.2 에서는 @JavascriptInterface 주석을 사용하여 직접 선언할 수 있습니다. 다음은 로컬 Java 메소드입니다.
공용 클래스 상호 작용 {
@JavascriptInterface
공용 문자열 back(){
"hello world" 로 돌아갑니다.
}
}
Mwebview 에 전화하다. 이 메서드를 정의한 후 javascriptinterface () 메서드를 추가합니다.
Mwebview.addjavascriptinterface (new js interaction (), "Android");
그럼 js 로 어떻게 부를까요?
& lt scripttype = "text/JavaScript" >
함수 s(){
//Java 를 리콜하는 () 메서드입니다.
Var result = window.android.back ();
Document.getelementbyid ("p") 입니다. InnerHTML = result
}
& lt/스크립트 >
4. HTML 페이지에서 클릭 이벤트를 차단합니다.
Mwebview.setwebview client (new webview client () {
@ 덮어쓰기
Public boolean should override URL loading (webview 뷰, 문자열 URL ){
//URL 차단 이벤트 결정
If (url.equals ("file:///Android _ asset/test2.html") {
Log.e (레이블, "shouldoverrideurlloading:"+URL ";
Startactivity (new intent (mainactivity.this, main2activity.class));
True 를 반환합니다
} 그렇지 않으면 {
Mwebview.loadurl (URL);
False 를 반환합니다
}
}
});
이는 Java 가 js 메소드를 호출하고 js 가 Java 메소드를 호출하는 상호 작용 방식 중 하나입니다. 전체 코드는 다음과 같습니다.
주요 활동
공용 클래스 MainActivity 는 AppCompatActivity {
Public static final String 태그 = "main activity";
개인 WebView mWebView
@ 덮어쓰기
보호된 void oncreate (bundle saved instance estate) {
Super.oncreate (savedinstancestate);
Setcontentview (r.layout.activity _ main);
Mwebview = (webview) findviewbyid (r.id.webview);
Mwebview.load URL ("file:///Android _ asset/test.html");
Websettings websettings = mwebview.getsettings ();
Websettings.set JavaScript enabled (true);
Mwebview.addjavascriptinterface (new js interaction (), "Android");
Mwebview.setwebview client (new webview client () {
@ 덮어쓰기
Public boolean should override URL loading (webview 뷰, 문자열 URL ){
If (url.equals ("file:///Android _ asset/test2.html") {
Log.e (레이블, "shouldoverrideurlloading:"+URL ";
Startactivity (new intent (mainactivity.this, main2activity.class));
True 를 반환합니다
} 그렇지 않으면 {
Mwebview.loadurl (URL);
False 를 반환합니다
}
}
});
}
//Android 는 반환 값으로 js 메서드를 호출합니다.
@ target API (빌드. 버전 코드입니다. KITKAT)
공용 void onClick (뷰 v ){
Mwebview.evaluatejavascript ("sum (1,2)", new ValueCallback & lt 문자열 & gt() {
@ 덮어쓰기
Public void onReceiveValue (문자열 값) {
Log.e (태그, "onreceivevaluevalue ="+value ");
}
});
}
공용 클래스 상호 작용 {
@JavascriptInterface
공용 문자열 back(){
"hello world" 로 돌아갑니다.
}
}
}
Test.html
& lt! DOCTYPE html & gt
& lthtml & gt
& lthead & gt
& lttitle & gt& lt/title & gt;;
& lt scripttype = "text/JavaScript" >
Sum(a 함수 (a, b ){
A+b 를 반환합니다.
}
함수 s(){
Var result = window.android.back ();
Document.getelementbyid ("p") 입니다. InnerHTML = result
}
& lt/스크립트 >
& lt/head & gt;;
& ltbody & gt
& ltbuttononclick = "s ()" > 로컬 메서드 호출
& LTA href = "file:///Android _ asset/test2.html" > 클릭
& LTP id = "p">. & lt/p & gt;;
& lt/body & gt;;
& lt/html & gt;;