android webview
Demo地址:https://github.com/zGuangYuan/Androidstudio_example
WebView介绍:
Android WebView在Android平台上是一个特殊的View, 基于webkit引擎、展现web页面的控件,这个类可以被用来在你的app中仅仅显示一张在线的网页,还可以用来开发浏览器。WebView内部实现是采用渲染引擎来展示view的内容,提供网页前进后退,网页放大,缩小,搜索。
功能:
加载网页:
1.加载URL(网络或者本地assets文件夹下的html文件)
2.加载html代码
3.Native和JavaScript相互调用
如何加载网络的URL:
使用方法:webview.loadUrl(“网址”),就可以访问网页了
如何加载assets下的html文件
使用方法:webview.loadUrl("本地文件名")
如何加载html代码
方法一:webview.loadData();
方法二:webview.loadDataWithBaseURL();
网页的前进后退
使用方法:webview.canGoBack(),判断是否能返回。
使用方法:webview.goBack();返回
使用方法:webview.canGoForward();判断是否能前进
使用方法:webview.goForward();前进
使用方法:webview.canGoBackOrForWard(int steps);判断是否能前进或者后退,参数是int类型,+3是否可以前进三步,-3代表是否可以后退三步。
注意:我们在Android操作系统中,按返回键,默认退出当前的Activity,如果希望是WebView在一个Activity的页面后退怎么做呢?
需要去复写onKeyDown方法改变按返回键的状态,如果按返回键时,网页还可以返回,那么就执行网页返回,webview.canGoBack();方法判断,如果网页没得返回了就退出当前的Activity.
新建一个包,命名为WebView:
在WebView中新建一个Empty Activity,命名为WebViewActivity :
在默认的MainActivity新增一个按钮能跳转到WebViewActivity :
在MainActivity中为这个按钮绑定一个监听器,实现选择跳转:
整体代码:
package com.example.yuan.e06_gridview;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.example.yuan.e06_gridview.GridView.GridViewActivity;
import com.example.yuan.e06_gridview.ListView.ListViewActivity;
import com.example.yuan.e05_listview.R;
import com.example.yuan.e06_gridview.RecycleView.RecycleViewActivity;
import com.example.yuan.e06_gridview.WebView.WebViewActivity;
public class MainActivity extends AppCompatActivity {
//声明引用
private Button mIVButton;
private Button mLVButton;
private Button mGVButton;
private Button mRVButton;
private Button mWVButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件对象
mIVButton=(Button) findViewById(R.id.IVButton_Id);
mLVButton=(Button) findViewById(R.id.LVButton_Id);
mGVButton=(Button) findViewById(R.id.GVButton_Id);
mRVButton=(Button) findViewById(R.id.RVButton_Id);
mWVButton=(Button) findViewById(R.id.WVButton_Id);
setlistener();
}
//设置监听器
public void setlistener(){
ButtonClickListener listener =new ButtonClickListener();
mLVButton.setOnClickListener(listener);
mIVButton.setOnClickListener(listener);
mGVButton.setOnClickListener(listener);
mRVButton.setOnClickListener(listener);
mWVButton.setOnClickListener(listener);
}
//实现监听器接口
class ButtonClickListener implements OnClickListener{
@Override
public void onClick(View v) {
Intent intent = null;
switch (v.getId()){
case R.id.GVButton_Id:
intent=new Intent(MainActivity.this, GridViewActivity.class);
break;
case R.id.IVButton_Id:
intent = new Intent(MainActivity.this,ImageViewActivity.class);
break;
case R.id.LVButton_Id:
intent =new Intent(MainActivity.this, ListViewActivity.class);
break;
case R.id.RVButton_Id:
intent = new Intent(MainActivity.this, RecycleViewActivity.class);
break;
case R.id.WVButton_Id:
intent =new Intent(MainActivity.this, WebViewActivity.class);
break;
}
startActivity(intent);
}
}
}
基本工作完成,进入主题。
1. 加载assets下的html文件
新建一个Assets文件夹:
需要在assets放置一个html文件,本地新建一个hello.html,文件,如下:
复制到assets文件夹下:
在WebViewActivity对应的布局文件,activity_web_view.xml,新建一个WebView控件。
在WebViewActivity声明控件,获取控件对象,然后加载hello.html这个文件:
运行应用程序,成功加载本地的html文件:
这是最简单的本地html的加载,同样你也可以把网页的Html给复制出来,然后到本地加载,我们试一试:
找到一篇博客,然后复制他的html内容,博客地址:https://blog.csdn.net/qq_36243942/article/details/82187204
右边一个弹窗:点击图片的地方:
然后在上边的文字右键,这样就复制了这篇文章的Html代码了:
赋值到本地assets文件夹中,很复杂的一堆东西:
接下来运行这个应用程序,就可以加载网页的内容啦,可以上下滑动查看全部内容:
我们也可以直接加载网络的URL,试一下
2.加载网络的URL:
修改WebViewActivity,直接去访问博客的地址:
运行一下,可以成功加载出来了:
把URL地址改成百度的访问一下:网址:https://m.baidu.com
运行应用程序,发现显示不出来:怎么回事?
这是因为如果WebView加载页面里面需要JavaScrip的支持,那么你需要对WebView进行设置,默认不支持JavaScrip,百度首页是需要JS支持的,所以访问之前也需要先对WebView进行设置,增加一个方法,getSettings().setJavaScriptEnabled(true);方法设置为真,表示支持JavaScrip.增加这个方法后再次访问试一下:
发现,现在就可以正常访问百度首页了:
试一下能不能使用搜索引擎,发现有一些是可以的,但是一些不行:
这是为什么呢?有一些网页,你打开的时候,不是默认在这个WebView基础之上继续打开的,如何设置?
修改WebViewActivity.java。继续在当前WebView继续加载网页:
代码:
package com.example.yuan.e06_gridview.WebView;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import com.example.yuan.e05_listview.R;
public class WebViewActivity extends AppCompatActivity {
//声明引用
private WebView mWVmhtml;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
//获取控件对象
mWVmhtml=(WebView) findViewById(R.id.WV_Id);
//加载本地html文件
// mWVmhtml.loadUrl("file:///android_asset/hello.html");
//加载网络URL
//mWVmhtml.loadUrl("https://blog.csdn.net/qq_36243942/article/details/82187204");
//设置JavaScrip
mWVmhtml.getSettings().setJavaScriptEnabled(true);
//访问百度首页
mWVmhtml.loadUrl("https://m.baidu.com");
//设置在当前WebView继续加载网页
mWVmhtml.setWebViewClient(new MyWebViewClient());
}
class MyWebViewClient extends WebViewClient{
@Override //WebView代表是当前的WebView
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//表示在当前的WebView继续打开网页
view.loadUrl(request.getUrl().toString());
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.d("WebView","开始访问网页");
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d("WebView","访问网页结束");
}
}
}
运行应用程序,现在就可以正常的浏览网页了,不会出现让你用别的浏览器打开:
并且当你打开一个网页时,打印出开始访问网页,加载网打印访问网页结束?
但是此时我们按返回按键,直接退出当前的Activity,而不是回到上一个网页:
一按返回键就直接退出了这个Activity,我们需要的是如果后面还有网页只需要后退一步,并不需要退出这个Activity:如何修改?
我们需要去复写onKeyDown()函数:
现在再次浏览网页,返回就是返回上一个页面,而不是直接退出了。
显示网页Title监听网页进度
继承WebChromeClient这个类,复写里面常用的方法,设置网页标题:
运行应用程序:
整体代码:
package com.example.yuan.e06_gridview.WebView;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import com.example.yuan.e05_listview.R;
public class WebViewActivity extends AppCompatActivity {
//声明引用
private WebView mWVmhtml;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
//获取控件对象
mWVmhtml=(WebView) findViewById(R.id.WV_Id);
//加载本地html文件
// mWVmhtml.loadUrl("file:///android_asset/hello.html");
//加载网络URL
//mWVmhtml.loadUrl("https://blog.csdn.net/qq_36243942/article/details/82187204");
//设置JavaScrip
mWVmhtml.getSettings().setJavaScriptEnabled(true);
//访问百度首页
mWVmhtml.loadUrl("https://m.baidu.com");
//设置在当前WebView继续加载网页
mWVmhtml.setWebViewClient(new MyWebViewClient());
mWVmhtml.setWebChromeClient(new MyWebChromeClient());
}
class MyWebViewClient extends WebViewClient{
@Override //WebView代表是当前的WebView
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//表示在当前的WebView继续打开网页
view.loadUrl(request.getUrl().toString());
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.d("WebView","开始访问网页");
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d("WebView","访问网页结束");
}
}
class MyWebChromeClient extends WebChromeClient{
@Override //监听加载进度
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
@Override//接受网页标题
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
//把当前的Title设置到Activity的title上显示
setTitle(title);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//如果按返回键,此时WebView网页可以后退
if (keyCode==KeyEvent.KEYCODE_BACK&&mWVmhtml.canGoBack()){
mWVmhtml.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
相关阅读
Android之——Surface、SurfaceView与SurfaceHolder.C
一、Surface Surface在SDK的文档中的描述是这样的:Handle onto a raw buffer that is being managed by the screen compositor
Android位移动画之——TranslateAnimation实现大师哥
一、背景Android中的动画效果是一个非常强大的功能,在使用过程中极大地提高的用户的视觉以及操作体验,Animations是一个实现Android
转载:https://juejin.im/post/59df8033518825693d7b4538 分享一个完整的社区项目(Android端加后台) '乡吧'社区APP安卓端代码
为什么要进行内存优化 APP运行内存限制,OOM导致APP崩溃 APP性能:流畅性、响应速度和用户体验 查看APP内存的方法和工具 我们
1.默认跳转页面的修改 腾讯信鸽推送存在一个问题,如果后台不指定一个推送界面Activity 默认会打开应用 如果让后台来指定界面,感