很多时候,我们需要在自己的程序中展示一些网页。但是使用手机中的浏览器会让用户脱离你的程序。怎么办呢?只能是在自己的程序中加入浏览器的功能了。于是,我们需要用到 WebView 。
在程序中内嵌一个浏览器很容易。
<WebView
android:id="@+id/wbvw"
android:layout_width="match_parent"
android:layout_height="match_parent"></WebView>
把这条语句写入 activity_main.xml 中即可。
然后在 MainActivity.java 中的 onCreate 里加上这两句
WebView webView = (WebView)findViewById(R.id.wbvw);
webView.getSettings().setJavaScriptEnabled(true);//让浏览器支持javascript
webView.setWebViewClient(new WebViewClient())
webView.loadUrl("http://www.baidu.com");
之后就是权限问题了,在 AndroidManifest.xml 中申请一下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cofox.mywebview">
<uses-permission android:name="android.permission.INTERNET"/>
...
完成了。但是太简单了。
如果你只是内嵌一个网页,不需要对它做什么控制,这就算完成了。实际使用中你就去修改那个“百度的网址”就好了。
而我们今天还是给它实现基本的浏览器必备功能吧。所以,activity_main.xml 中加入了地址栏、转到按钮,还有首页、后退、前进、刷新按钮。
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.cofox.mywebview.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="horizontal">
<EditText
android:id="@+id/edtttUri"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:singleLine="true"
android:maxLines="1"
android:scrollHorizontally="false"
android:layout_weight="1"/>
<Button
android:id="@+id/btnGo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="转到"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btnHome"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="首页"/>
<Button
android:id="@+id/btnBack"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="后退"/>
<Button
android:id="@+id/btnForeward"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="前进"/>
<Button
android:id="@+id/btnRefresh"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="刷新"/>
</LinearLayout>
<WebView
android:id="@+id/wbvw"
android:layout_width="match_parent"
android:layout_height="match_parent"></WebView>
</LinearLayout>
在 MainActivity.java 首先声明一个变量,用来存储默认首页网址
private String strUriHome = "http://www.baidu.com";//默认首页
顺便声明一下界面的各种控件
WebView webView;//浏览器
EditText edtttUri;//地址栏
Button btnGo;//打开网页按钮
Button btnHome;//首页按钮
Button btnBack;//返回按钮
Button btnForward;//前进按钮
Button btnRefresh;//刷新按钮
在 onCreate 中实例化界面控件,并且监听 Click 事件。为了方便统一管理监听,在 Class 上需要扩展 implements View.OnClickListener
public class MainActivity extends AppCompatActivity implements View.OnClickListener
webView = (WebView)findViewById(R.id.wbvw);
edtttUri = (EditText)findViewById(R.id.edtttUri);
btnGo = (Button)findViewById(R.id.btnGo);
btnHome = (Button)findViewById(R.id.btnHome);
btnBack = (Button)findViewById(R.id.btnBack);
btnForward = (Button)findViewById(R.id.btnForeward);
btnRefresh = (Button)findViewById(R.id.btnRefresh);
webView.getSettings().setJavaScriptEnabled(true);//让浏览器支持javascript
webView.setWebViewClient(new WebViewClient(){
@Override
public void onLoadResource(WebView view, String url) {
edtttUri.setText(view.getUrl());
super.onLoadResource(view, url);
}
}); //当跳转网页时,仍在WebView中打开。
webView.loadUrl(strUriHome);
edtttUri.setText(strUriHome);
btnGo.setOnClickListener(this);
btnHome.setOnClickListener(this);
btnBack.setOnClickListener(this);
btnForward.setOnClickListener(this);
btnRefresh.setOnClickListener(this);
onLoadResource 中的 edtttUri.setText(view.getUrl()) 是实现把当前页面的地址显示到地址栏功能。
统一的 onClick 功能实现了转到、首页、后退、前进、刷新。
@Override
public void onClick(View v) {
switch (v.getId()){
//转到
case R.id.btnGo:
try {
String strUri = uriHttpFirst(edtttUri.getText().toString());//网址协议判断
webView.loadUrl(strUri);
} catch (Exception e) {
e.printStackTrace();
}
break;
//首页
case R.id.btnHome:
try {
webView.loadUrl(strUriHome);
} catch (Exception e) {
e.printStackTrace();
}
break;
//返回
case R.id.btnBack:
try {
webView.goBack();
} catch (Exception e) {
e.printStackTrace();
}
break;
//前进
case R.id.btnForeward:
try {
webView.goForward();
} catch (Exception e) {
e.printStackTrace();
}
break;
//刷新
case R.id.btnRefresh:
try {
webView.reload();
} catch (Exception e) {
e.printStackTrace();
}
break;
default:
break;
}
}
网络访问都是需要通过各种协议进行通讯的。网页浏览一般需要通过 http 协议或者 https 协议。(网络协议详细介绍请百度_)
所以在访问某个网址前,我们需要先判断一下,地址是否添加了要使用的协议。如果没有就默认在地址前增加一个http的头。这个功能我们用一个 uriHttpFirst(String strUri) 方法来实现。
//地址HTTP协议判断,无HTTP打头的,增加http://,并返回。
private String uriHttpFirst(String strUri){
if(strUri.indexOf("http://",0) != 0 && strUri.indexOf("https://",0) != 0 ){
strUri = "http://" + strUri;
}
return strUri;
}
互联网访问权限已经申请过了。就不重复了。
看一下 MainActivity.java的完整代码
package com.cofox.mywebview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private String strUriHome = "http://www.baidu.com";//默认首页
WebView webView;//浏览器
EditText edtttUri;//地址栏
Button btnGo;//打开网页按钮
Button btnHome;//首页按钮
Button btnBack;//返回按钮
Button btnForward;//前进按钮
Button btnRefresh;//刷新按钮
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView)findViewById(R.id.wbvw);
edtttUri = (EditText)findViewById(R.id.edtttUri);
btnGo = (Button)findViewById(R.id.btnGo);
btnHome = (Button)findViewById(R.id.btnHome);
btnBack = (Button)findViewById(R.id.btnBack);
btnForward = (Button)findViewById(R.id.btnForeward);
btnRefresh = (Button)findViewById(R.id.btnRefresh);
webView.getSettings().setJavaScriptEnabled(true);//让浏览器支持javascript
webView.setWebViewClient(new WebViewClient(){
@Override
public void onLoadResource(WebView view, String url) {
edtttUri.setText(view.getUrl());//当前WebView网址更新显示到地址栏
super.onLoadResource(view, url);
}
}); //当跳转网页时,仍在WebView中打开。
webView.loadUrl(strUriHome);
edtttUri.setText(strUriHome);
btnGo.setOnClickListener(this);
btnHome.setOnClickListener(this);
btnBack.setOnClickListener(this);
btnForward.setOnClickListener(this);
btnRefresh.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
//转到
case R.id.btnGo:
try {
String strUri = uriHttpFirst(edtttUri.getText().toString());//网址协议判断
webView.loadUrl(strUri);
} catch (Exception e) {
e.printStackTrace();
}
break;
//首页
case R.id.btnHome:
try {
webView.loadUrl(strUriHome);
} catch (Exception e) {
e.printStackTrace();
}
break;
//返回
case R.id.btnBack:
try {
webView.goBack();
} catch (Exception e) {
e.printStackTrace();
}
break;
//前进
case R.id.btnForeward:
try {
webView.goForward();
} catch (Exception e) {
e.printStackTrace();
}
break;
//刷新
case R.id.btnRefresh:
try {
webView.reload();
} catch (Exception e) {
e.printStackTrace();
}
break;
default:
break;
}
}
//地址HTTP协议判断,无HTTP打头的,增加http://,并返回。
private String uriHttpFirst(String strUri){
if(strUri.indexOf("http://",0) != 0 && strUri.indexOf("https://",0) != 0 ){
strUri = "http://" + strUri;
}
return strUri;
}
}
运行效果图
MyWebView
网友评论