1.引言
在平时项目中难免会用到webview,每次用都要百度,太麻烦了,趁着周末将webview常见的用法总结下。主要内容如下:
webview常见的几种用法。
如何在app里面加入html
2.用法
2.1 webview加载url
webview跟我们平时用到的button,textview一样都需要在layout中声明,然后再activity findviewbyid,下面是我写的layout布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.example.lenovo.webviewtest.MainActivity"
tools:showIn="@layout/activity_main">
<Button
android:id="@+id/button1"
android:text="开始加载html"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<WebView
android:layout_marginTop="10dp"
android:id="@+id/testwebview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>
</LinearLayout>
主activity的代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button but;
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView=(WebView) findViewById(R.id.testwebview);
but=(Button) findViewById(R.id.button1);
but.setOnClickListener(this);
}
@Override
public void onClick(View v) {
webView.loadUrl("https://www.baidu.com");
}
}
这种方式的加载很简单。在这里就不贴图片了,只是简单介绍下。
2.2加载html代码
webview可以加载html代码,只需要把html的代码编程string类型,调用webview.loadDataWithBaseUrl(), 注意webview里面也有一个loadData()方法,这个和loadDataWithBaseUrl功能差不多,但是因为loadData 容易产生乱码,当时有中文的时候,因此最好使用loadDataWithBaseUrl。布局代码如上,在项目中添加assets文件。这个文件专门放 原生。不可更改 只可读取的资源。如图所示:我的assets文件。
读取assets文件,到String 类型的html代码,onclick核心代码如下:
}
@Override
public void onClick(View v) {
String s=null;
StringBuffer buffer=new StringBuffer();
InputStream str=null;
try {
str=getResources().getAssets().open("htmlducument/index.txt");//打开index.txt文件 获取流
} catch (IOException e) {
e.printStackTrace();
}
DataInputStream in=new DataInputStream(str);
try {
s=in.readLine();
} catch (IOException e) {
e.printStackTrace();
}
while (s!=null)
{
buffer.append(s);
try {
s=in.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null!=in)
{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null!=str)
{
try {
str.close();
} catch (IOException e) {
e.printStackTrace();
}
}
webView.loadDataWithBaseURL(null,new String(buffer),"text/html","utf-8",null);
}
在这里解释下loadDataWithBaseURL(String baseurl,String data,String mimetype,String encoding,String historyUrl)每个参数的意思。
baseurl:url地址,不过这里一般为null。
data:传入String 类型的html代码
mimetype:数据类型 这里是“text/html”
encoding:”utf-8”/”gbk”/”gb2132”
historyUrl:之前的url 一般设置成null
按照上面运行的结果如图所示:
下面的webview显示的是一趟数字,那是因为css 样式没加载出来。通过string来加载html 假如css样式是内置的话,可以,假如是外置的话,就行不通。百度也没搜索出结果来。通过这个方法来加载数据一般不采用。
2.3webview+webviewclient的使用,
这个很常见。 webviewclient是辅助webview处理各种时间回调,各种通知的,具体常见的 请求事件方法有:
onPageStarted :请求开始被调用.
onPageFinished : 页面加载完毕调用.
shouldOverrideUrlLoading : 在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的.
核心代码如下:
@Override
public void onClick(View v) {
WebSettings settings=webView.getSettings();
settings.setJavaScriptEnabled(true);//能否调用js
settings.setAllowFileAccess(false);//false的话 系统外的文件不能访问
settings.setBuiltInZoomControls(true);//设置是否能用手来扩大缩小。true可以,false不行。默认的时false
webView.requestFocusFromTouch();//如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。
webView.loadUrl("http://blog.anycodes.cn/?cate=71");
webView.setWebViewClient(new MyWebViewClient());
}
public class MyWebViewClient extends WebViewClient
{
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//加载狂提示在这里进行
Toast.makeText(MainActivity.this,"开始请求",Toast.LENGTH_SHORT).show();
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
//消除加载提示
Toast.makeText(MainActivity.this,"请求结束",Toast.LENGTH_SHORT).show();
super.onPageFinished(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
webView.loadUrl(url);
return true;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//假如按返回键
if (keyCode==KeyEvent.KEYCODE_BACK)
{
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
运行结果如下:
onkeydown方法的重写目的是 当用户按下back键的时候,执行webview.goback()方法 返回上一层。
以上webview大概的用法都讲完了。
3.app中中嵌入html
在上面我们讲了。webview可以加载String类型的html代码。但是却不好加载css样式。实际上webview也可以加载 本地 url和加载 webclient不同但是 url的格式不一样。例如放在assets里面的 index.html和 css文件夹下的style.css
注意:在index.html 里面的css 引用路径要写正确否则无法加载正确。
更改的代码主要是loadurl:
webView.loadUrl("file:///android_asset/htmlducment/index.html");
注意是: 是 3个 “/”
提示下: “../” 当前目录的上一层目录。 “./” 当前目录。
加载结果如图:
加载的效果非常好,以后wepapp会越来越流行,到时候开发android 会越来越简单,或许web程序员和android程序员 合二为一了。今天就写到这里。希望这篇博客能够帮到大家。