概念:
是一个开放的浏览器组件,是基于WebKit内核开发出来的,像苹果的Safari、Google Chrome浏览器都是通过WebView实现的,
而在Android系统之中,默认也提供了WebView组件的支持,用户可以直接使用WebView组件显示网页的内容,或者是将一些指定的HTML文件嵌入进来,
除了支持各个浏览器的“前进”、“后退”等功能之外,最为强大的是在WebView组件之中也支持JavaScript的操作。
android.webkit.WebView的继承结构如下所示:
java.lang.Object
? android.view.View
? android.view.ViewGroup
? android.widget.AbsoluteLayout
? android.webkit.WebViewwebView使用方法(加载网页超链接和本地连接资源)
WebView控件浏览网页: 布局文件使用WebView控件 使用loadUrl(url)方法加载网页 AndroidManifest.xml文件配置网络访问权限 <uses-permission android:name="android.permission.INTERNET"/> app:ptrMode="both"支持上拉和下拉刷新 设置webviewClient 重写shouldOverrideUrlLoading方法
案例(装载HTML和本地连接):
public class MainActivity extends AppCompatActivity {
private EditText et_url;
private Button btn_open;
private WebView wv;
private ProgressBar pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
et_url= (EditText) findViewById(R.id.et_url);
btn_open= (Button) findViewById(R.id.btn_open);
wv= (WebView) findViewById(R.id.wv);
pb= (ProgressBar) findViewById(R.id.pb);
btn_open.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
wv.loadUrl(et_url.getText().toString());
}
});
//设置输入的url在当前浏览器打开,不设置会提示打开新的浏览器
wv.setWebViewClient(new MyClient());
//设置加载进度条
wv.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
pb.setProgress(newProgress);//添加加载进程进度条
// setTitle("Loading...");
// if(newProgress==1){
// pb.setVisibility(View.GONE);
// setTitle("加载完成");
// }
}
});
//加载本地HTML文件,在main包下新建assets包,复制导入HTML文件夹
wv.loadUrl("file:/android_asset/me/index.html");
wv.getSettings().setBuiltInZoomControls(true);//支持缩放
wv.getSettings().setJavaScriptEnabled(true);//允许支持JS脚本(网页动态效果)
}
class MyClient extends WebViewClient{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {//过时的方法用于sdk版本小于21的
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP)//当Sdk版本大于21时才能使用此方法
view.loadUrl(request.getUrl().toString());
return super.shouldOverrideUrlLoading(view, request);
}
}
WebView装载HTML代码(Http协议访问网络):
布局文件使用WebView控件 assets文件夹中放html代码 使用loadUrl("file:/android_asset/.../xxx.html")载入html 注:webview.getSettings().setJavaScriptEnabled(true);//启用javascript webview.getSettings().setBuiltInZoomControls(true);//控制页面缩放 AndroidManifest.xml文件配置网络访问权限 <uses-permissionandroid:name="android.permission.INTERNET"/>
案例Get+Post方法:
public class MainActivity extends AppCompatActivity {
private EditText et_user,et_password;
private Button btn_login;
private MyThread thread=null;
private MyHandle handle=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
handle=new MyHandle();//实例化控件时候也实例化handle
et_user= (EditText) findViewById(R.id.et_user);
et_password= (EditText) findViewById(R.id.et_password);
btn_login= (Button) findViewById(R.id.btn_login);
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//①实例化控件,给按钮添加点击事件,点击按钮启动子线程
if (thread==null){
thread=new MyThread();
thread.start();
}
}
});
}
/**
* ②自定义子线程
*/
class MyThread extends Thread{
//③重写run方法
//访问网络,进行登录,把登录的结果利用handle发送到主线程,写一个访问网络的方法
@Override
public void run() {
super.run();
//⑤调用访问网络的方法,获取结果值
// String result= loginGet();
String result=loginPost();
//⑥子线程向主线程发送message,需要自定义handle
Message message= handle.obtainMessage(1,result);
handle.sendMessage(message);
//发送过消息,线程置空,方便下次使用
thread=null;
}
}
自定义Handle类用于给主线程发送信息:
/**
* ⑦自定义Handle类,发送消息
*
*/
class MyHandle extends Handler{
//重写handleMessage方法
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();
break;
}Get请求方式:
/**
* ④定义一个访问网络的方法
*get请求方式,明文传参
*/
private String loginGet(){
String username=et_user.getText().toString();
String password=et_password.getText().toString();
String strurl=null;
//输入框非空验证
if(username!=null&&password!=null){
strurl=”http://192.168.15.114:8080/HttpTest/Login?username=”+username+”&password=”+password;
}
try {
URL url=new URL(strurl);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();//打开连接
conn.setRequestMethod(“GET”);//设置请求方式,大写的GET
//获取请求结果
int code=conn.getResponseCode();
if(code==200){//请求成功,返回请求结果码200,读取流结果
InputStream is=conn.getInputStream();//获取流文件
InputStreamReader isr=new InputStreamReader(is);//读取流文件
BufferedReader reader=new BufferedReader(isr);//一次读一行
String line=”“;//定义空行用于追加内容
StringBuffer buffer=new StringBuffer();
while ((line=reader.readLine())!=null){//如果还没有读完
buffer.append(line);//一直追加内容
}
//关闭流,断开连接
reader.close();
conn.disconnect();
//返回获取到的请求结果
return buffer.toString();
}else {
return “访问失败”;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return “访问失败”;
}Post请求方式:
/**
* post请求方法
* 与get请求就只有发送数据的方式不同,不是明文传参
*/
private String loginPost(){
String username=et_user.getText().toString();
String password=et_password.getText().toString();
String strurl=null;
String data=null;
//输入框非空验证
if(username!=null&&password!=null){
strurl=”http://192.168.15.114:8080/HttpTest/Login”;
data=”username=”+username+”&password=”+password;
}
try {
URL url=new URL(strurl);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();//打开连接
// conn.setRequestMethod(“GET”);//设置请求方式,大写的GET
conn.setRequestMethod(“POST”);//设置请求方式为POST
//允许输入输入数据的设定,允许输入和输出,将数据date写入内存
conn.setDoInput(true);
conn.setDoOutput(true);
//设置请求的头
conn.setRequestProperty(“Content-Type”, “application/x-www-form-urlencoded”);
conn.setRequestProperty(“Charset”, “utf-8”);
conn.setRequestProperty(“Content-Length”, “” + data.getBytes().length);
//将data数据写入内存
OutputStream os=conn.getOutputStream();
os.write(data.getBytes());
os.flush();//刷新内存中的数据
//获取请求结果
int code=conn.getResponseCode();
if(code==200){//请求成功,返回请求结果码200,读取流结果
InputStream is=conn.getInputStream();//获取流文件
InputStreamReader isr=new InputStreamReader(is);//读取流文件
BufferedReader reader=new BufferedReader(isr);//一次读一行
String line=”“;//定义空行用于追加内容
StringBuffer buffer=new StringBuffer();
while ((line=reader.readLine())!=null){//如果还没有读完
buffer.append(line);//一直追加内容
}
//关闭流,断开连接
reader.close();
conn.disconnect();
//返回获取到的请求结果
return buffer.toString();
}else {
return “访问失败”;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return “访问失败”;
}