zoukankan      html  css  js  c++  java
  • WebView使用总结(应用函数与JS函数互相调用)

    1.当只用WebView的时候,最先注意的当然是在配置文件中添加访问因特网的权限; 

    2.如果访问的页面中有Javascript,必须设置支持Javascript:
     
    Java代码
    1.    webview.getSettings().setJavaScriptEnabled(true);
    2.   
    复制代码
    3.如果希望点击链接由自己处理而不是新开Android的系统browser中响应该链接.给WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法 shouldOverrideUrlLoading对网页中超链接按钮的响应 
    Java代码 
    1. mWebView.setWebViewClient(new WebViewClient() {
    2. /**
    3. * Show in webview not system webview.
    4. */
    5. public boolean shouldOverrideUrlLoading(WebView view, String url) {
    6.     view.loadUrl(url);
    7.     return super.shouldOverrideUrlLoading(view, url);
    8. }
    9. }
    复制代码
    这样就保证了每次打开的页面都是在WebView实例中显示运行的; 

    4.在显示WebView时,点击手机Back时,会完全退出当前Activity,如果想退到历史浏览页面:重写back监听: 
    Java代码
    1. public boolean onKeyDown(int keyCode, KeyEvent event) {
    2. WebView mWebView = (WebView) findViewById(R.id.browser);
    3. if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
    4.      mWebView.goBack();
    5.      return true;
    6.   }
    7. return super.onKeyDown(keyCode, event);
    8. }
    复制代码
    5.Android SDK提供了一个schema前缀为"file:///android_asset/".WebView遇到这样的schema,就去当前包中的 assets目录中找内容.如:"file:///android_asset/demo.html" 
    下面一段代码是对网页中JS的类似Alert()类的函数进行相应的重写响应: 
    Java代码 
    1. webView.setWebChromeClient(new WebChromeClient() {
    2.                         public boolean onJsAlert(WebView view, String url, String message,
    3.                                         final JsResult result) {
    4.                                 AlertDialog.Builder b = new AlertDialog.Builder(BrowserJs.this);
    5.                                 b.setTitle("Alert");
    6.                                 b.setMessage(message);
    7.                                 b.setPositiveButton(android.R.string.ok,
    8.                                                 new AlertDialog.OnClickListener() {
    9.                                                         public void onClick(DialogInterface dialog,
    10.                                                                         int which) {
    11.                                                                 result.confirm();
    12.                                                         }
    13.                                                 });
    14.                                 b.setCancelable(false);
    15.                                 b.create();
    16.                                 b.show();
    17.                                 return true;
    18.                         };
    19.                         @Override
    20.                         public boolean onJsConfirm(WebView view, String url,
    21.                                         String message, final JsResult result) {
    22.                                 AlertDialog.Builder b = new AlertDialog.Builder(BrowserJs.this);
    23.                                 b.setTitle("Confirm");
    24.                                 b.setMessage(message);
    25.                                 b.setPositiveButton(android.R.string.ok,
    26.                                                 new AlertDialog.OnClickListener() {
    27.                                                         public void onClick(DialogInterface dialog,
    28.                                                                         int which) {
    29.                                                                 result.confirm();
    30.                                                         }
    31.                                                 });
    32.                                 b.setNegativeButton(android.R.string.cancel,
    33.                                                 new DialogInterface.OnClickListener() {
    34.                                                         public void onClick(DialogInterface dialog,
    35.                                                                         int which) {
    36.                                                                 result.cancel();
    37.                                                         }
    38.                                                 });
    39.                                 b.setCancelable(false);
    40.                                 b.create();
    41.                                 b.show();
    42.                                 return true;
    43.                         };
    44.                         @Override
    45.                         public boolean onJsPrompt(WebView view, String url, String message,
    46.                                         String defaultValue, final JsPromptResult result) {
    47.                                 final LayoutInflater factory = LayoutInflater
    48.                                                 .from(BrowserJs.this);
    49.                                 final View v = factory.inflate(
    50.                                                 R.layout.prompt_dialog, null);
    51.                                 ((TextView) v.findViewById(R.id.prompt_message_text))
    52.                                                 .setText(message);
    53.                                 ((EditText) v.findViewById(R.id.prompt_input_field))
    54.                                                 .setText(defaultValue);
    55.                                 AlertDialog.Builder b = new AlertDialog.Builder(BrowserJs.this);
    56.                                 b.setTitle("Prompt");
    57.                                 b.setView(v);
    58.                                 b.setPositiveButton(android.R.string.ok,
    59.                                                 new AlertDialog.OnClickListener() {
    60.                                                         public void onClick(DialogInterface dialog,
    61.                                                                         int which) {
    62.                                                                 String value = ((EditText) v
    63.                                                                                 .findViewById(R.id.prompt_input_field))
    64.                                                                                 .getText().toString();
    65.                                                                 result.confirm(value);
    66.                                                         }
    67.                                                 });
    68.                                 b.setNegativeButton(android.R.string.cancel,
    69.                                                 new DialogInterface.OnClickListener() {
    70.                                                         public void onClick(DialogInterface dialog,
    71.                                                                         int which) {
    72.                                                                 result.cancel();
    73.                                                         }
    74.                                                 });
    75.                                 b.setOnCancelListener(new DialogInterface.OnCancelListener() {
    76.                                         public void onCancel(DialogInterface dialog) {
    77.                                                 result.cancel();
    78.                                         }
    79.                                 });
    80.                                 b.show();
    81.                                 return true;
    82.                         };
    83.                         public void onProgressChanged(WebView view, int newProgress) {
    84.                                 BrowserJs.this.getWindow().setFeatureInt(
    85.                                                 Window.FEATURE_PROGRESS, newProgress * 100);
    86.                                 super.onProgressChanged(view, newProgress);
    87.                         }
    88.                         public void onReceivedTitle(WebView view, String title) {
    89.                                 BrowserJs.this.setTitle(title);
    90.                                 super.onReceivedTitle(view, title);
    91.                         }
    92.                 });
    93.                 go.setOnClickListener(new OnClickListener() {
    94.                         public void onClick(View view) {
    95.                                 String url = text.getText().toString();
    96.                                 webView.loadUrl(url);
    97.                         }
    98.                 });
    99.                 webView.loadUrl("file:///android_asset/index.html");
    复制代码
    在上述代码中,用到的prompt_dialog.xml: 
    Java代码
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3.         android:gravity="center_horizontal" android:orientation="vertical"
    4.         android:layout_width="fill_parent" android:layout_height="wrap_content">
    5.         <TextView android:id="@+id/prompt_message_text"
    6.                 android:layout_width="fill_parent" android:layout_height="wrap_content" />
    7.         <EditText android:id="@+id/prompt_input_field"
    8.                 android:layout_width="fill_parent" android:layout_height="wrap_content"
    9.                 android:selectAllOnFocus="true" android:scrollHorizontally="true"
    10.                 android:minWidth="250dp" />
    11. </LinearLayout>
    复制代码
    还有assets中的Html文件: 
    Java代码
    1. <html>
    2. <script type="text/javascript">
    3.   function onAlert(){
    4.           alert("This is a alert sample from html");
    5.   }
    6.   function onConfirm(){
    7.           var b=confirm("are you sure to login?");
    8.           alert("your choice is "+b);
    9.   }
    10.   function onPrompt(){
    11.           var b=prompt("please input your password","aaa");
    12.           alert("your input is "+b);
    13.   }
    14. </script>
    15. <pre>
    16. <input type="button" value="alert" onclick="onAlert()"/>
    17. <input type="button" value="confirm" onclick="onConfirm()"/>
    18. <input type="button" value="prompt" onclick="onPrompt()"/>
    19. <a href="http://www.google.com"/>Google</a>
    20. </pre>
    21. </html>
    复制代码
    接着上篇: 
    6.通过字符串拼凑的html页面显示: 
    Java代码
    1. public void simpleJsClick() {
    2.                 WebView webView = (WebView) findViewById(R.id.webview);
    3.                 String html = "<html>"
    4.                                 + "<body>"
    5.                                 + "图书封面<br>"
    6.                                 + "<table width='200' border='1' >"
    7.                                 + "<tr>"
    8.                                 + "<td><a onclick='alert(\"Java Web开发速学宝典\")' ><img style='margin:10px' src='http://images.china-pub.com/ebook45001-50000/48015/cover.jpg' width='100'/></a></td>"
    9.                                 + "<td><a onclick='alert(\"大象--Thinking in UML\")' ><img style='margin:10px' src='http://images.china-pub.com/ebook125001-130000/129881/zcover.jpg' width='100'/></td>"
    10.                                 + "</tr>"
    11.                                 + "<tr>"
    12.                                 + "<td><img style='margin:10px' src='http://images.china-pub.com/ebook25001-30000/27518/zcover.jpg' width='100'/></td>"
    13.                                 + "<td><img  style='margin:10px' src='http://images.china-pub.com/ebook30001-35000/34838/zcover.jpg' width='100'/></td>"
    14.                                 + "</tr>" + "</table>" + "</body>" + "</html>";
    15.                 webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", null);
    16.                 webView.getSettings().setJavaScriptEnabled(true);
    17.                 webView.setWebChromeClient(new WebChromeClient());
    18.         }
    复制代码
    7.在同种分辨率的情况下,屏幕密度不一样的情况下,自动适配页面: 
    Java代码
    1. DisplayMetrics dm = getResources().getDisplayMetrics();
    2.    int scale = dm.densityDpi;
    3.    if (scale == 240) { // 
    4.       webView.getSettings().setDefaultZoom(ZoomDensity.FAR);
    5.     } else if (scale == 160) {
    6.       webView.getSettings().setDefaultZoom(ZoomDensity.MEDIUM);
    7.     } else {
    8.       webView.getSettings().setDefaultZoom(ZoomDensity.CLOSE);
    9. }
    复制代码
    8.判断加载的页面URL地址是否正确: 
    Java代码 
    1.    if(URLUtil.isNetworkUrl(url)==true)
    复制代码
    9.设置WebView的一些缩放功能点: 
    Java代码 
    1. webView.getSettings().setJavaScriptEnabled(true);
    2. webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    3. webView.setHorizontalScrollBarEnabled(false);
    4. webView.getSettings().setSupportZoom(true);
    5. webView.getSettings().setBuiltInZoomControls(true);
    6. webView.setInitialScale(70);
    7. webView.setHorizontalScrollbarOverlay(true);
    复制代码
    完成java文件: 
    Java代码
    1. public class MethodMutual extends Activity {
    2.         private WebView mWebView;
    3.         private Handler mHandler = new Handler();
    4.         private static final String LOG_TAG = "WebViewDemo";
    5.         /** Called when the activity is first created. */
    6.         @Override
    7.         public void onCreate(Bundle savedInstanceState) {
    8.                 super.onCreate(savedInstanceState);
    9.                 setContentView(R.layout.main);
    10.                 loadAssetHtml();
    11.         }
    12.         public void loadAssetHtml() {
    13.                 mWebView = (WebView) findViewById(R.id.webview);
    14.                 WebSettings webSettings = mWebView.getSettings();
    15.                 webSettings.setSavePassword(false);
    16.                 webSettings.setSaveFormData(false);
    17.                 webSettings.setJavaScriptEnabled(true);
    18.                 webSettings.setSupportZoom(false);
    19.                 mWebView.setWebChromeClient(new MyWebChromeClient());
    20.                 // 将一个java对象绑定到一个javascript对象中,javascript对象名就是interfaceName,作用域是Global.
    21.                 mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
    22.                 mWebView.loadUrl("file:///android_asset/demo.html");
    23.                 // 通过应用中按钮点击触发JS函数响应
    24.                 Button mCallJS = (Button) findViewById(R.id.mCallJS);
    25.                 mCallJS.setOnClickListener(new OnClickListener() {
    26.                         @Override
    27.                         public void onClick(View v) {
    28.                                 mWebView.loadUrl("javascript:wave()");
    29.                         }
    30.                 });
    31.         }
    32.         private int i = 0;
    33.         final class DemoJavaScriptInterface {
    34.                 DemoJavaScriptInterface() {
    35.                 }
    36.                 /**
    37.                  * This is not called on the UI thread. Post a runnable to invoke
    38.                  * loadUrl on the UI thread.
    39.                  */
    40.                 public void callAndroid() {
    41.                         mHandler.post(new Runnable() {
    42.                                 public void run() {
    43.                                         if (i % 2 == 0) {
    44.                                                 mWebView.loadUrl("javascript:wave()");
    45.                                         } else {
    46.                                                 mWebView.loadUrl("javascript:waveBack()");
    47.                                         }
    48.                                         i++;
    49.                                 }
    50.                         });
    51.                 }
    52.         }
    53.         /**
    54.          * Provides a hook for calling "alert" from javascript. Useful for debugging
    55.          * your javascript.
    56.          */
    57.         final class MyWebChromeClient extends WebChromeClient {
    58.                 @Override
    59.                 public boolean onJsAlert(WebView view, String url, String message,
    60.                                 JsResult result) {
    61.                         Log.d(LOG_TAG, message);
    62.                         result.confirm();
    63.                         return true;
    64.                 }
    65.         }
    66. }
    复制代码
    main.xml文件: 
    Java代码
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3.         android:orientation="vertical" android:layout_width="fill_parent"
    4.         android:layout_height="fill_parent">
    5.         <Button android:layout_width="wrap_content" android:text="CallJs"
    6.                 android:layout_height="wrap_content" android:id="@+id/mCallJS" />
    7.         <WebView android:id="@+id/webview" android:layout_width="fill_parent"
    8.                 android:layout_height="fill_parent" />
    9. </LinearLayout>
    复制代码
    demo.html: 
    Java代码
    1. <html>
    2.         <script language="javascript">
    3.             /* This function is invoked by the activity */
    4.                 function wave() {
    5.                     alert("1");
    6.                         document.getElementById("droid").src="android_waving.png";
    7.                         alert("2");
    8.                 }
    9.                  /* This function is invoked by the activity */
    10.                 function waveBack() {
    11.                     alert("1");
    12.                         document.getElementById("droid").src="android_normal.png";
    13.                         alert("2");
    14.                 }
    15.         </script>
    16.         <body>
    17.             <!-- Calls into the javascript interface for the activity -->
    18.             <a onClick="window.demo.callAndroid()"><div style="80px;
    19.                         margin:0px auto;
    20.                         padding:10px;
    21.                         text-align:center;
    22.                         border:2px solid #202020;" >
    23.                                 <img id="droid" src="android_normal.png"/><br>
    24.                                 Click me!
    25.                 </div></a>
    26.         </body>
    27. </html>
    复制代码
    还有用到的2张机器人图片: 

    <ignore_js_op>1.png<ignore_js_op>2.png
  • 相关阅读:
    软工实践个人总结
    实验 7:OpenDaylight 实验——Python 中的 REST API 调用(含选做)
    2020软工实践第二次结对作业
    mocha单元测试简单教程
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman实现流表下发
    实验 5:OpenFlow 协议分析和 OpenDaylight 安装
    实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
    福州大学软件工程实践第一次个人编程作业
    实验 3:Mininet实验 —— 测量路径的损耗率
    实验 2:Mininet 实验——拓扑的命令脚本生成
  • 原文地址:https://www.cnblogs.com/greywolf/p/2830903.html
Copyright © 2011-2022 走看看