Android與JS交互的細節(jié)問題

1.首先準備一個test.html文檔女器,如下:

<html>
<meta charset="utf-8"><head>    
<title>js交互android</title>    
<script type="text/javascript">        
function show(){        var a = document.getElementById("text").value;       
 alert("警告,你輸入的是:"+a);        }       
 function rfInfo(jsonStr) {     
           document.getElementById("info").innerHTML="從Android客戶端傳來的作者信息:"+jsonStr.Developer;            
}        
function cfm() {       
 if(confirm("確認界面提示?"))
{            return true;      
  }
else   {      
return false;       
 }       
}
 function pmt() {        
var place = prompt("請輸入位置?","");        }   
 </script>
</head>
<body>
<form action="">    
<p>    
<div id="info">從Android客戶端傳來的作者信息:</div> 
   </p>    
<p>
<input type="text" id="text" value="input your msg"/>
</p>  
  <p>    
<div id="inputinfo">輸入的信息:</div> 
   </p>   
 <p><input type="button" id="btn_alert" onclick="show()" 
value="Alert"/>
</p>  
  <p>
<input type="button" id="btn_cfm" onclick="cfm()" 
value="Confirm"/></p>   
 <p>
<input type="button" id="btn_pmt" onclick="pmt()" value="Prompt"/>
</p>    
<p>
<input type="button" id="btn_android" onclick="window.demo.adrdMethod()"            
  value="調(diào)用android方法"/>
</p>
</form>
</body>
</html>

注意看網(wǎng)頁中《調(diào)用android方法》的button的點擊事件较沪,onclick中的內(nèi)容就相當于指向android中adrdMethod()方法的id.

2.Android的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"    
xmlns:tools="http://schemas.android.com/tools"    
android:layout_width="match_parent"    
android:layout_height="match_parent" 
   android:orientation="vertical"    
tools:context="com.alden.l_alden.jsandandroid.MainActivity">    
<Button        
android:id="@+id/btn"       
 android:layout_width="wrap_content"   
 android:layout_height="wrap_content"       
 android:text="調(diào)用js方法"/>    
<WebView       
 android:id="@+id/webview"    
    android:layout_width="match_parent"      
  android:layout_height="match_parent" />
</LinearLayout>

3.在WebView中加載test.html頁面取刃,并且與Android交互

界面.png
//
@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends AppCompatActivity {    
private WebView webView;    
private Button button;    
final String  jsonStr = "{\"Developer\":\"Alden\",\"Place\":\"Nanjing\"}";    
@Override    
protected void onCreate(Bundle savedInstanceState) {        
super.onCreate(savedInstanceState);        
setContentView(R.layout.activity_main);        
webView = (WebView) findViewById(R.id.webview);        
button = (Button) findViewById(R.id.btn);       
webView.setWebChromeClient(new WebChromeClient()
 {            
/*此處覆蓋的是javascript中的alert方法。                   
 *當網(wǎng)頁需要彈出alert窗口時吭净,會執(zhí)行onJsAlert中的方法                   
 * 網(wǎng)頁自身的alert方法不會被調(diào)用盈简。                   
 */            
@Override           
 public boolean onJsAlert(WebView view, String url, String message, JsResult result) {                
Toast.makeText(getApplicationContext(), message,                        Toast.LENGTH_LONG).show();                
Log.d("info", "彈出了提示框");               
 result.confirm();               
 return true;            } 
 /*此處覆蓋的是javascript中的confirm方法凑耻。                   
*當網(wǎng)頁需要彈出confirm窗口時,會執(zhí)行onJsConfirm中的方法                   
* 網(wǎng)頁自身的confirm方法不會被調(diào)用柠贤。                   */        
    @Override            
public boolean onJsConfirm(WebView view, String url,                              String message, JsResult result) {               
 Log.d("info", "彈出了確認框");                
result.confirm();                
return true;            }            
//在方法中寫自己想要取代彈出js輸入框的實現(xiàn)代碼香浩,比如一個Dialog
            
@Override            
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                
Log.d("info", "彈出了輸入框");                
result.confirm();               
 return true;            }            
/*                    
* 如果頁面被強制關閉,彈窗提示:是否確定離開钉寝?                   
 * 點擊確定 保存數(shù)據(jù)離開凫碌,點擊取消,停留在當前頁面                    */            
@Override           
 public boolean onJsBeforeUnload(WebView view, String url,    String message, JsResult result) {               
 Log.d("info", "彈出了離開確認框");               
 result.confirm();               
 return true;            }        
});
webView.setWebViewClient(new WebViewClient() {            
/*點擊頁面的某條鏈接進行跳轉(zhuǎn)的話焕檬,會啟動系統(tǒng)的默認瀏覽器進行加載宴霸,調(diào)出了我們本身的應用                    
* 因此囱晴,要在shouldOverrideUrlLoading方法中                   
 */            
@Override            
public boolean shouldOverrideUrlLoading(WebView view, String url) {                //使用當前的WebView加載頁面                view.loadUrl(url);                return true;            }
/*            
 * 網(wǎng)頁加載完畢(僅指主頁,不包括圖片)            
 */            
@Override            
public void onPageStarted(WebView view, String url, Bitmap favicon) {                
// TODO Auto-generated method stub                
super.onPageStarted(view, url, favicon);            
}            
/*            
 * 網(wǎng)頁加載完畢(僅指主頁瓢谢,不包括圖片)            
 */            
@Override            
public void onPageFinished(WebView view, String url) 
{               
 // TODO Auto-generated method stub
                super.onPageFinished(view, url);            
}           
 /*            
 * 加載頁面資源            
 */           
 @Override            
public void onLoadResource(WebView view, String url) {                
// TODO Auto-generated method stub     
super.onLoadResource(view, url);          
  }           
 /*             
* 錯誤提示             
*/           
 @Override            
public void onReceivedError(WebView view, int errorCode,   String description, String failingUrl) {                
// TODO Auto-generated method stub
super.onReceivedError(view, errorCode, description, failingUrl); 
           }        }); 
//支持js代碼(必須要的)
webView.getSettings().setJavaScriptEnabled(true);      
  //設置是否支持縮放       
 webView.getSettings().setSupportZoom(false);     

   
//js調(diào)用android的方法接口畸写,第二個參數(shù)就相當于js對象找android中這個方法的鑰匙,
webView.addJavascriptInterface(new Object(){ 
//此方法內(nèi)容須創(chuàng)建子線程操作氓扛,不然會出現(xiàn)下面這個錯誤
//Uncaught Error: Error calling method on NPObject        
 @JavascriptInterface       
public void adrdMethod() {       
 new Thread(new Runnable() {                  
 @Override                  
 public void run() {                       
Log.d("info", "js調(diào)用了Android方法");                  
 }              
 }).start();          
  }       
 },"demo");     

  
 button.setOnClickListener(new View.OnClickListener() {     
 @Override            
public void onClick(View v) {                
Log.d("info", "Android調(diào)用了js方法");                       
 /*                         
* 通過webView.loadUrl("javascript:xxx")方式就可以調(diào)用當前網(wǎng)頁中的名稱為xxx的javascript方法                        
 */                
webView.loadUrl("javascript:rfInfo("+jsonStr+")");            } 
       });        
webView.loadUrl("file:///android_asset/test.html");    }}

總結:

1.Android調(diào)用js中的方法:
通過webView.loadUrl("javascript:xxx")方式就可以調(diào)用當前網(wǎng)頁中的名稱為xxx的javascript方法
2.js調(diào)用Android中的方法:
webView.addJavascriptInterface(Object object,String str):第一個參數(shù)是一個類對象枯芬,第二個參數(shù)是js中調(diào)用此類中的方法的標識
3.js調(diào)用的android的方法中的操作需要在子線程中论笔,不然報錯
Uncaught Error: Error calling method on NPObject ;
4.首先你要支持js代碼(必須要的)
webView.getSettings().setJavaScriptEnabled(true);

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末千所,一起剝皮案震驚了整個濱河市狂魔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淫痰,老刑警劉巖最楷,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異待错,居然都是意外死亡籽孙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門火俄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚯撩,“玉大人,你說我怎么就攤上這事烛占。” “怎么了沟启?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵忆家,是天一觀的道長。 經(jīng)常有香客問我德迹,道長芽卿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任胳搞,我火速辦了婚禮卸例,結果婚禮上,老公的妹妹穿的比我還像新娘肌毅。我一直安慰自己筷转,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布悬而。 她就那樣靜靜地躺著呜舒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笨奠。 梳的紋絲不亂的頭發(fā)上袭蝗,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音般婆,去河邊找鬼到腥。 笑死,一個胖子當著我的面吹牛蔚袍,可吹牛的內(nèi)容都是我干的乡范。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼篓足!你這毒婦竟也來了段誊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤栈拖,失蹤者是張志新(化名)和其女友劉穎连舍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涩哟,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡索赏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贴彼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潜腻。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖器仗,靈堂內(nèi)的尸體忽然破棺而出融涣,到底是詐尸還是另有隱情,我是刑警寧澤精钮,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布威鹿,位于F島的核電站,受9級特大地震影響轨香,放射性物質(zhì)發(fā)生泄漏忽你。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一臂容、第九天 我趴在偏房一處隱蔽的房頂上張望科雳。 院中可真熱鬧,春花似錦脓杉、人聲如沸糟秘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚌堵。三九已至,卻和暖如春沛婴,著一層夾襖步出監(jiān)牢的瞬間吼畏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工嘁灯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泻蚊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓丑婿,卻偏偏與公主長得像性雄,于是被迫代替她去往敵國和親没卸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容