WebView详解一:打造优雅的WebView
Posted Anonymous-OS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebView详解一:打造优雅的WebView相关的知识,希望对你有一定的参考价值。
相关文章:
《WebView详解二:Android与JS交互的实现过程》
《下拉刷新?我看好MaterialRefreshLayout!》
废话不多说老样子,先上效果图:
嘻嘻,千万别认为这是浏览器,这只是一个简单的WebView而已,伙伴们先不要喷,无论在怎么折腾,产品经理只要满意,你做的就是一个完美的答卷,对不对?
下面就来打造一个属于你自己的的WebView吧!
一、使用WebView并不需要开通网络权限
WebView可以加载本地html文件和加载网络的Url路径,对其都有很好的支持
二、众多的基本属性你都知道吗?
(1)表示不支持js,如果想让java和js交互或者本身希望js完成一定的功能请把false改为true。
mWebView.getSettings().setjavascriptEnabled(false);
(2)设置是否支持缩放,我这里为false,默认为true。
mWebView.getSettings().setSupportZoom(false);
(3)设置是否显示缩放工具,默认为false。
mWebView.getSettings().setBuiltInZoomControls(false);
(4)一般很少会用到这个,用WebView组件显示普通网页时一般会出现横向滚动条,这样会导致页面查看起来非常不方便。LayoutAlgorithm是一个枚举,用来控制html的布局,总共有三种类型:
NORMAL:正常显示,没有渲染变化。
SINGLE_COLUMN:把所有内容放到WebView组件等宽的一列中。
NARROW_COLUMNS:可能的话,使所有列的宽度不超过屏幕宽度。
mWebView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
(5)不现实水平滚动条
mWebView.setHorizontalScrollBarEnabled(false);
(6)不现实垂直滚动条
mWebView.setVerticalScrollBarEnabled(false);
(7)滚动条在WebView内侧显示
mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
(8)滚动条在WebView外侧显示
mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
(9)加载网页有时候会左右滑动,没法自适应屏幕,就加上下面的两句话
mWebView.getSettings().setUseWideViewPort(true);//设置此属性,可任意比例缩放
mWebView.getSettings().setLoadWithOverviewMode(true);
三、废话不说了,大家都知道,实现效果先
XML文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<TextView
android:id="@+id/title"
android:gravity="center"
android:textSize="15dp"
android:textColor="#ffffff"
android:background="#4998e7"
android:layout_width="match_parent"
android:layout_height="47dp"/>
<ProgressBar
android:id="@+id/Progress"
android:padding="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal" />
<com.cjj.MaterialRefreshLayout
android:id="@+id/refresh"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:overlay="false"
app:wave_color="#4998e7"
app:wave_show="true">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"/>
</com.cjj.MaterialRefreshLayout>
</LinearLayout>
MainActivity文件:
public class MainActivity extends AppCompatActivity
private WebView mWebView;
private TextView mTitle;
private ProgressBar mProgress;
private MaterialRefreshLayout mMaterialRefreshLayout;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initWebView();
initRefreshLayout();
/**
* 初始化View
*/
private void initView()
mTitle = (TextView) findViewById(R.id.title);
mProgress = (ProgressBar) findViewById(R.id.Progress);
mWebView = (WebView) findViewById(R.id.webview);
mMaterialRefreshLayout = (MaterialRefreshLayout) findViewById(R.id.refresh);
/**
* 初始化WebView
*/
private void initWebView()
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setBlockNetworkImage(false);
mWebView.loadUrl("http://www.qq.com/");
mWebView.setWebViewClient(new MyWebviewClient());
mWebView.setWebChromeClient(new MyChromeClient());
/**
* 初始化RefreshLayout刷新
* 不解释,相关的请看文章头部的MaterialRefreshLayout的连接
*/
private void initRefreshLayout()
mMaterialRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener()
@Override
public void onRefresh(MaterialRefreshLayout materialRefreshLayout)
//下拉刷新停止
mWebView.loadUrl(mWebView.getUrl());
mMaterialRefreshLayout.finishRefresh();
);
/**
* 重写MyWebviewClient方法
*
* shouldOverrideUrlLoading() 拦截网页跳转,是之继续在WebView中进行跳转
* onPageStarted() 开始加载的时候(显示进度条)
* onPageFinished() 夹在结束的时候(隐藏进度条)
*/
private class MyWebviewClient extends WebViewClient
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
view.loadUrl(url);
return false;
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon)
super.onPageStarted(view, url, favicon);
mProgress.setVisibility(View.VISIBLE);
@Override
public void onPageFinished(WebView view, String url)
super.onPageFinished(view, url);
mProgress.setVisibility(View.GONE);
/**
* 重写MyChromeClient方法
*
* onProgressChanged() 设置动态进度条
* onReceivedTitle() 设置WebView的头部标题
* onReceivedIcon() 设置WebView的头部图标
*/
private class MyChromeClient extends WebChromeClient
@Override
public void onProgressChanged(WebView view, int newProgress)
super.onProgressChanged(view, newProgress);
mProgress.setProgress(newProgress);
@Override
public void onReceivedTitle(WebView view, String title)
super.onReceivedTitle(view, title);
mTitle.setText(title);
@Override
public void onReceivedIcon(WebView view, Bitmap icon)
super.onReceivedIcon(view, icon);
/**
* 实现WebView的回退栈
*
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
if (keyCode== KeyEvent.KEYCODE_BACK && mWebView.canGoBack())
mWebView.goBack();
return true;
return super.onKeyDown(keyCode, event);
注释全都在代码里,详细解释显得啰嗦!
以上是关于WebView详解一:打造优雅的WebView的主要内容,如果未能解决你的问题,请参考以下文章
text 如何设计一个优雅健壮的Android WebView?(上)
安卓WebView详解 (三)--Webview的API及说明
WebView使用详解——WebViewClient与常用事件监听