第六十九讲:Android之WebView(3)
第六十九讲:Android之WebView(三)
下面是MainActivity.java主界面文件:
下面是运行结果:
进步,意味着目标不断前移,阶段不断更新,它的视影不断变化。——雨果
本讲内容:两个和WebView相关的重要对象:WebChromeClient 和 WebViewClient
和WebView相关的辅助对象,除了WebSettings以外还有WebChromeClient和WebViewClient。
我们通过一个例子感受一下,代码的讲解都写在注释里了,所以我就直接上代码和代码的运行结果。
在assets/html新建一个txet2.html文件
<span style="font-size:18px;"> <script type="text/JavaScript"> function alertFuction(){ var a=1; var b=2 alert(a+b); } function confirmFuction(){ confirm("你确定要删除吗?") } </script> <p>对话框测试</p> <input onclick="alertFuction()" value="提醒对话框" type="button"> <br><br> <input onclick="confirmFuction()" value="选择对话框" type="button"> <br><br> <a href="text1.html">上一页</a></span>
下面是res/layout/activity_main.xml 布局文件:
<RelativeLayout 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" tools:context="com.example.text1.MainActivity$PlaceholderFragment" > <Button android:id="@+id/b1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="webViewClient对象方法测试"/> <Button android:id="@+id/b2" android:layout_below="@id/b1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="webViewChromeClient对象方法测试"/> <WebView android:id="@+id/webView" android:layout_below="@id/b2" android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity implements OnClickListener { private Button b1; private Button b2; WebView webView; private static final String TAG="MyService"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1 = (Button) findViewById(R.id.b1); b2 = (Button) findViewById(R.id.b2); b1.setOnClickListener(this); b2.setOnClickListener(this); webView = (WebView) findViewById(R.id.webView); // 覆盖默认后退按钮的作用,替换成WebView里的查看历史页面 webView.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { webView.goBack(); return true; } } return false; } }); // 设置支持Javascript webView.getSettings().setJavaScriptEnabled(true); // 创建WebViewClient对象 WebViewClient wvc = new WebViewClient() { @Override public void onLoadResource(WebView view, String url) { Log.i(TAG, "WebViewClient.onLoadResource"); super.onLoadResource(view, url); } @Override public void onPageFinished(WebView view, String url) { Log.i(TAG, "WebViewClient.onPageFinished"); super.onPageFinished(view, url); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.i(TAG, "WebViewClient.onPageStarted"); super.onPageStarted(view, url, favicon); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.i(TAG, "WebViewClient.shouldOverrideUrlLoading"); webView.loadUrl(url); return true; // 记得消耗掉这个事件。给不知道的朋友再解释一下,Android中返回True的意思就是到此为止 //吧,事件就会不会冒泡传递了,我们称之为消耗掉 } }; // 设置WebViewClient对象 webView.setWebViewClient(wvc); // 创建WebViewChromeClient WebChromeClient wvcc = new WebChromeClient() { // 处理Alert事件 @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { // 构建一个Builder来显示网页中的alert对话框 Builder builder = new Builder(MainActivity.this); builder.setTitle("计算1+2的值"); builder.setMessage(message); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }); builder.setCancelable(false); builder.create(); builder.show(); return true; } // 处理Confirm事件 @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { Builder builder = new Builder(MainActivity.this); builder.setTitle("删除确认"); builder.setMessage(message); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }); builder.setNeutralButton(android.R.string.cancel, new AlertDialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }); builder.setCancelable(false); builder.create(); builder.show(); return true; } // 处理提示事件 @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { // 看看默认的效果 return super.onJsPrompt(view, url, message, defaultValue, result); } @Override public void onReceivedTitle(WebView view, String title) { MainActivity.this.setTitle("可以用onReceivedTitle()方法修改网页标题"); super.onReceivedTitle(view, title); } }; // 设置setWebChromeClient对象 webView.setWebChromeClient(wvcc); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.b1: // 加载URL assets目录下的内容可以用 "file:///android_asset" 前缀 webView.loadUrl("file:///android_asset/html/text1.html"); break; case R.id.b2: webView.loadUrl("file:///android_asset/html/text2.html"); break; } } }
下面是运行结果:
点击第一个按钮 我们可以看到WebViewClient对象中定义的方法的确被调用了。
点击第二个按钮 我们看到加载的网页中有两个按钮,我们知道默认情况下Android会直接忽略掉由javascript弄出来的alert等弹出信息,除非我们在WebChromeClient中覆盖onJsAlert()方法和onJsConfirm()方法,让我们分别点击它们看看效果。
接下来我们再页面中跳转几次后,使用后退按钮,查看我们是否屏蔽了Activity默认的行为,结果当然是屏蔽了
本讲就到这里,Take your time and enjoy it