- WebSettings:主要是对WebView进行管理配置
- WebViewClient:处理请求、通知事件
- WebViewChromeClient:帮助WebView处理网站的JS的相关信息
我们在上篇文章实现WebView时,使用了一个setJavaScriptEnabled( )方法来支持JavaScript脚本,这个方法就是属于WebSettings类,下面我们通过在WebView中添加这些子类中的常用方法,来了解并掌握其用法和应用场景。
1、WebSettings类
webView.getSettings( ):创建WebSettings对象
setJavaScriptEnabled(true):WebView支持JavaScript
setPluginEnabled(true):WebView支持插件
setSupportZoom(true):WebView支持缩放
setAllowFileAccess(true):WebView能够访问文件
setLoadsImageAutomatically(true):支持自动加载图片
2、WebViewClient类
shouldOverrideUrlLoading( ):WebView打开网页,不调用浏览器
onPageStarted( ):开始载入页面时调用该方法,可以设置Loading等待页面
onPageFinished( ):结束页面加载时调用,可以设置关闭Loading条,等动作
3、WebChromeClient类
onProgressChanged( ):获取网页的加载进度
onReceivedTitle( ):获取网页的标题
以上就是一些比较基本常用的方法,当然,WebView子类中的方法很多,大家可以根据应用需求去相应的类中查看使用方法(Ctrl+点击类名)。
下面来实现一个实例:获取并显示网页的标题、开始、结束加载提示和显示加载进度。
新建一个ACtivity,首先我们来写布局文件,在Activity的布局文件中我们添加4个TextView控件,分别用于显示通过WebView下相应的方法获取到的网页标题、开始加载提示、结束加载提示,加载进度。再添加一个WebView控件,布局代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center"> <TextView android:id="@+id/tv_title" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#D52B2B" android:layout_marginTop="10dp" /> <TextView android:id="@+id/tv_start" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#D52B2B" android:layout_marginTop="10dp" /> <TextView android:id="@+id/tv_progress" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#D52B2B" android:layout_marginTop="10dp" /> <TextView android:id="@+id/tv_end" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#D52B2B" android:layout_marginTop="10dp" android:layout_marginBottom="10dp"/> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" />LinearLayout>
布局好之后我们再回到Activity的java文件中,来声明找到控件,并通过WebView子类中的方法获实现我们需要显示的网页信息,代码如下:
public class WebView_Activity extends AppCompatActivity { private WebView mWebView; private TextView mTvStart,mTvProgress,mTvEnd,mTvTitle; @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view_); mWebView = findViewById(R.id.webView); mTvStart = findViewById(R.id.tv_start); mTvProgress = findViewById(R.id.tv_progress); mTvEnd = findViewById(R.id.tv_end); mTvTitle = findViewById(R.id.tv_title); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.loadUrl("https://m.sogou.com/"); mWebView.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); mTvStart.setText("开始加载"); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mTvEnd.setText("加载结束"); } }); mWebView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); if (newProgress < 100){ String progress = newProgress + "%"; mTvProgress.setText(progress); }else{ mTvProgress.setText("100%"); } } @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); mTvTitle.setText(title); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // 如果按下的按键是返回键并且webView可以返回,就执行webView返回 if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); }}
上面代码中声明控件的代码不做解释,都是最基础的代码,我们先是通过连写的方式使用方法mWebView.getSettings().setJavaScriptEnabled(true)使WebView支持JavaScript,接着在setWebViewClient方法中通过匿名内部类的方法来重写WebViewClient子类中的方法:
onPageStarted:重写该方法,在调用该方法时,文本框中显示"开始加载"的提示信息
onPageFinished:重写该方法,在网页加载结束时,文本框中提示"加载结束"提示
接着通过setWebChromeClient方法,也是使用内部类的方式来添加WebChromeClient子类,并重写其中的显示加载进度的方法:
onProgressChanged:该方法就是用于获取网页加载进度,在该方法中,我们通过if、else语句判断,当前加载进度小于100时,会通过setText方法在TextView中显示当前的加载进度,其中newProgress就是当前的加载进度,否则显示100%
onReceivedTitle:这个方法是用于获取当前网页的标题,再拖setText方法将获取到的标题在TextView中显示出来。
最后通过重写onKeyDown方法,实现点击"Back"键返回前一个页面,在上篇文章中我们有详细的讲解。到这里为止,我们实例的需求都实现了,分别为显示网页标题,提示开始加载、结束加载信息,显示实时的加载进度。我们来运行程序,查看一下运行结果。如下图:
观察运行结果,我们能看到,当程序启动时,会在页面的顶部显示当前网页的标题,当网页开始加载时,会显示"开始加载"提示,在网页加载中,会显示实时的百分比加载进度,最后网页加载结束,会显示"加载结束"文字。而且我们能发现,当打开一个新页面时,上面这些信息会显示新加载页面的信息。
通过上面简单的实例我们能发现,使用WebView子类中的方法能让我们直观的了解更多的网页信息,我们还可以使用其子类中的其他方法提高WebView的性能和安全性,防止内存泄漏等。后续的文章我们会通过一些实例来实现。
获取更多的Android学习知识和信息,请关注我们的微信公众号:秉空课堂