最近的项目中看产品文档的时候,发现设计文档中”资讯”栏目设计的图文并茂,有声有色,感叹之余,发觉如此的布局写起来太烦太累了…想到了平时使用浏览器看新闻的体验,感觉让服务端把资讯做成网页,客户端使用WebView这个组件来直接访问页面的方式挺不错.
WebView非常简单,Android已经封装的非常完善,写个小例子覆盖其间常用的几个方法;
新建一个安卓项目,建议使用2.3以上SDK(因为之前版本的SDK测试一直不太好使而且没确定原因);
首先创建个布局文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <WebView android:id="@+id/wv1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> <WebView android:id="@+id/wv2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> </LinearLayout> |
然后代码中调用并设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
import android.app.Activity ; import android.os.Bundle ; import android.util.Log ; import android.view.KeyEvent ; import android.webkit.WebSettings.LayoutAlgorithm ; import android.webkit.WebView ; import android.webkit.WebViewClient ; public class WebViewDemoActivity extends Activity { private WebView m_wv1 ; private WebView m_wv2 ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) ; setContentView(R.layout.main) ; initView(); } public void initView() { m_wv1 = (WebView)findViewById(R.id.wv1) ; m_wv1.getSettings().setJavaScriptEnabled(true) ; m_wv1.loadUrl("http://www.xuanyusong.com") ; //获取WebSettings对象,设置缩放 m_wv1.getSettings().setUseWideViewPort(true) ; m_wv1.getSettings().setLoadWithOverviewMode(true) ; m_wv1.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d("访问网址:",url) ; m_wv2.loadUrl(url) ; return true ; } }) ; m_wv2 = (WebView)findViewById(R.id.wv2) ; //获取WebSettings对象,设置单列 m_wv2.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN) ; m_wv2.getSettings().setJavaScriptEnabled(true) ; m_wv2.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d("访问网址:",url) ; m_wv2.loadUrl(url) ; return true ; } }) ; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if((keyCode==KeyEvent.KEYCODE_BACK)&&m_wv2.canGoBack()) { //如果可以回退 m_wv2.goBack() ; return true ; } return super.onKeyDown(keyCode,event) ; } } |
最后别忘了在AndroidManifest.xml文件中添加网络访问权限:
1 2 3 |
<uses-permission android:name="android.permission.INTERNET" /> |
第一个窗口中点击链接会在第二个窗口中打开,点击回退的话如果下面的WebView可以回退就会执行后退操作,如果不能则退出Activity.布局文件和代码都可以创建WebView对象,在此使用布局直接创建,代码创建的话构造方法有四个:
1 2 3 4 5 6 |
WebView(Context context) WebView(Context context, AttributeSet attrs) WebView(Context context, AttributeSet attrs, int defStyle) WebView(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) |
其中loadUrl方法可以让WebView载入指定的页面;
如果访问的页面有Javascript元素,使用 setJavaScriptEnabled(true) 可设置是否支持;
getSettings()方法可以获得当前WebView对象的WebSettings属性,通过这个属性可以给WebView获取或设置样式,比如例中设置的缩放和单列样式,双击上面WebView网页空白处可以放大该WebView;
通过setWebViewClient(WebViewClient webviewclient)方法可以设置WebView响应点击的超链接,参数WebViewClient重写其中的shouldOverrideUrlLoading方法,实现你想做的事情就可以了,在这里面是可以拿到点击链接的url的;例中WebView1的点击会在WebView2中打开;
覆盖onKeyDown方法是为了实现下面WebView的回退功能,否则的话会直接退出当前Activity;
还有需要注意的是,在显示有图片和网格的的页面时,WebView的表现并不是很尽如人意的,这个问题大部分情况都是在服务器的页面上动手脚,参照wap网站页面的做法最好了.
简单举例最常用的几个方法,想要深入学习和使用的话API还有很多方法.
- 本文固定链接: https://www.xuanyusong.com/archives/686
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
loadurl时会出现一下空白页,软后才显示出页面,空白页如何处理呢?
雨松大大,求教个问题啊。我做解析短信的时候,用广播接收短信后,想进行指定电话号码接收,然后显示到自己的软件上面,指定号码我是通过SharedPreference进行写入和读取的,然后用SMSAddress(通过getDisplayOriginatingAddress)与SharedPreference里面的电话进行equals判断,但是我debug以后,看到一个像“13838157205”,一个是13838157205,这样肯定不对的嘛 不知道大大知道原因不,求知道
学习了
潮汐的思念,这名字和我一个同学很像啊, 加油~~
如有雷同,纯属正常,呵呵,多谢支持~
支持滨滨