直接看代码即可,代码里面注释写的很清楚,这个类拉下来就能用;

写法和命名比较粗暴,但也简单易懂;

public class MainActivity extends AppCompatActivity {

    private final String TAG = MainActivity.this.getClass().getSimpleName();
private WebView wv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
QbSdk.initX5Environment(this,null); //最好在application中
getWindow().setFormat(PixelFormat.TRANSLUCENT);
wv = findViewById(R.id.wv);
final ProgressBar pb = findViewById(R.id.pb);
wv.loadUrl("https://github.com/CuiChenbo/CcMall");
wv.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
//重写此方法 可让webview不跳转到系统的浏览器
webView.loadUrl(url);
return super.shouldOverrideUrlLoading(webView, url);
}
}); wv.setWebChromeClient(new WebChromeClient(){
//WebView进度的回调监听
@Override
public void onProgressChanged(WebView webView, int i) {
super.onProgressChanged(webView, i);
if (i>=100){
pb.setProgress(100);
pb.setVisibility(View.GONE);
}else {
pb.setProgress(i);
}
} //JS Alert的监听 可用来做和js(H5)的交互
@Override
public boolean onJsAlert(WebView webView, String s, String s1, JsResult jsResult) {
return super.onJsAlert(webView, s, s1, jsResult);
}
//JsConfirm的监听
@Override
public boolean onJsConfirm(WebView webView, String s, String s1, JsResult jsResult) {
return super.onJsConfirm(webView, s, s1, jsResult);
}
//JsPrompt 的监听 可用来做和js(H5)的交互
@Override
public boolean onJsPrompt(WebView webView, String s, String s1, String s2, JsPromptResult jsPromptResult) {
return super.onJsPrompt(webView, s, s1, s2, jsPromptResult);
}
});
//WebView长按的监听
wv.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
WebView.HitTestResult hitTestResult = wv.getHitTestResult();
int type = hitTestResult.getType(); //获取触摸点的类型
final String extra = hitTestResult.getExtra(); //获取触摸点的数据
Log.i(TAG, "type:"+type+"____extra:"+extra);
if (type == WebView.HitTestResult.IMAGE_TYPE||type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE){
//说明触摸点的这个类型是图片类 去提示下载图片
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("提示")
.setMessage("是否保存图片")
.setPositiveButton("保存", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
SeveImage(extra);
}
})
.setNegativeButton("取消",null)
.show();
return true;
}else {
return false;
}
}
});
}
//保存图片
private void SeveImage(String extra) {
DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
Uri uri = Uri.parse(extra);
DownloadManager.Request request = new DownloadManager.Request(uri);
//设置允许使用的网络类型,这里是移动网络和wifi都可以
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
// 允许媒体扫描,根据下载的文件类型被加入相册、音乐等媒体库
request.allowScanningByMediaScanner();
//禁止发出通知,既后台下载,如果要使用这一句必须声明一个权限:android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
request.setShowRunningNotification(false);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//不显示下载界面
request.setVisibleInDownloadsUi(true);
request.setDestinationInExternalFilesDir(MainActivity.this, Environment.DIRECTORY_PICTURES, System.currentTimeMillis() + ".jpg");
//*设置下载后文件存放的位置,如果sdcard不可用,那么设置这个将报错,因此最好不设置如果sdcard可用,下载后的文件 在/mnt/sdcard/Android/data/packageName/files目录下面,如果sdcard不可用,设置了下面这个将报错,不设置,下载后的文件在/cache这个 目录下面*//*
//request.setDestinationInExternalFilesDir(this, null, "tar.apk");
long id = downloadManager.enqueue(request);
IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
DownloadMangerReceiver mDownloadMangerReceiver = new DownloadMangerReceiver();
registerReceiver(mDownloadMangerReceiver, intentFilter);
} //保存图片的监听
class DownloadMangerReceiver extends BroadcastReceiver {
private DownloadManager manager; @Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
manager =(DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
Toast.makeText(context, "文件下载完成", Toast.LENGTH_SHORT).show();
/*
* 获取下载完成对应的下载ID, 这里下载完成指的不是下载成功, 下载失败也算是下载完成,
* 所以接收到下载完成广播后, 还需要根据 id 手动查询对应下载请求的成功与失败.
*/
// 根据获取到的ID,使用上面第3步的方法查询是否下载成功
}
}
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//改写物理返回键的逻辑
if(keyCode== KeyEvent.KEYCODE_BACK) {
if(wv.canGoBack()) {
wv.goBack();//返回上一页面
return true;
} else {
System.exit(0);//退出程序
}
}
return super.onKeyDown(keyCode, event);
}
}

layout布局文件也看一下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent"
>
<ProgressBar
android:id="@+id/pb"
android:layout_width="match_parent"
android:layout_height="2dp"
android:max="100"
android:background="@color/colorAccent"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
/>
<com.tencent.smtt.sdk.WebView
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/wv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ccb.pactera.x5webview.MainActivity"> </com.tencent.smtt.sdk.WebView>
</LinearLayout>

com.tencent.smtt.sdk.WebView是我用的X5WebView,有兴趣的可以去看一下:X5WebView

WebView长按保存图片;WebView不跳转到系统的浏览器;WebView加载显示进度条;WebView返回事件处理;的更多相关文章

  1. vue:使用不同参数跳转同一组件,实现动态加载图片和数据,以及利用localStorage和vuex持久化数据

    需求:通过不同的参数复用同一组件,实现动态加载数据和图片,同时,在页面刷新时,图片依旧可以加载成功. 过程出现的bug和问题: 1.使用params传参后,再次刷新页面,参数丢失导致数据无法再次加载 ...

  2. webview长按保存图片

    private String imgurl = ""; /***     * 功能:长按图片保存到手机     */    @Override    public void onC ...

  3. java的跳转和重定向,加载显示层

    HttpServltRequest  req,   HttpDervletResponse resp 的 req.sendRedirect('页面');跳转到页面  浏览器地址跳转 --------- ...

  4. selenium模块跳过用户名密码验证码输入,加载浏览器标签和cookie,进行翻页爬虫多页动态加载的数据(js)

    能解决登陆一次后,之后不需要二次登陆的动态加载数据,网页保存的cookie和标签,加入到selenium自动化测试浏览器中 1 from selenium import webdriver 2 imp ...

  5. ios开发之--给WebView加载进度条

    不是新东西,就是在项目里面用到H5页面的时候,中间加载延迟的时候,在最上面加载一个进度条,代码如下: // 获取屏幕 宽度.高度 bounds就是屏幕的全部区域 #define KDeviceWidt ...

  6. WebView之加载网页时增加进度提示

    上一节讲了一些webview的基本使用以及在记载网页时如何屏蔽掉第三方浏览器,使我们自己开发的程序成为一个微型浏览器.那么这一节将一下在webView加载网页的过程中如何加上进度提示.效果图如下: 主 ...

  7. IOS WebView修改contentInset 导致webview长按弹出菜单跳动的解决方法

    最近在项目中需要用到webview 加载H5 并且在webview 底部使用原生UI添加其他空间比如广告.或者评论(Scrollview) 最初使用修改webview中scrollview 的cont ...

  8. Android WebView加载本地html并实现Java与JS交互

    最近做的一个项目中,用到自定义地图,将自定义地图转换成html页面,现在需要做的是如何将本地的html加载到android中,并可以实现交互. 相关讲解: 其实webview加载资源的速度并不慢,但是 ...

  9. WebView的使用及添加进度条

    实现的效果比较简单类似于微信打开网页,头部有个进度条显示加载进度 下载地址:http://download.csdn.net/detail/qq_29774291/9666941 1.在安卓端加载一个 ...

随机推荐

  1. SpringMVC请求体参数处理问题

    如果请求定义为application/json格式,则要用Spring MVC中@RequestBody参数才能接受(用@RequestParam参数接受会报400错误),但SpringMVC的@Re ...

  2. 利用 MessageRPC 和 ShareMemory 来实现 分布式并行计算

    可以利用 MessageRPC + ShareMemory 来实现 分布式并行计算 . MessageRPC :  https://www.cnblogs.com/KSongKing/p/945541 ...

  3. tomcat源码阅读之默认连接器

    默认连接器 一.UML图: 1.所有的连接器都要实现Connector接口,必须创建Request对象和Response对象,httpConnector作为默认连接器,肯定也是要实现Connector ...

  4. celery + redis quick start

    软件: redis server redis-server.exe 安装redis for python using pip 安装celery (redis)  pip install -U &quo ...

  5. 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink--容错机制(ACK,RDD,基于log和状态快照),消息处理at least once,exactly once两个是关键

    分布式流处理是对无边界数据集进行连续不断的处理.聚合和分析.它跟MapReduce一样是一种通用计算,但我们期望延迟在毫秒或者秒级别.这类系统一般采用有向无环图(DAG). DAG是任务链的图形化表示 ...

  6. IndexR

    IndexR是由舜飞科技研发的实时OLAP系统.于 2017 年 1 月初正式开源,目前已经更新至 0.6.1 版本,其作者认为IndexR具有以下特点: 超大数据集,低查询延时(超大数据集由HDFS ...

  7. JAVA常量与变量

    顺着箭头的转换为自动转换逆这箭头的转换为强制转换. 常量 关键字FINAL 命名为大写 标识符 1要以字母数字下划线和¥组成 2首字母不能为数字 3不能是JAVA的关键字和 保留字 4数据类型分为基本 ...

  8. 并查集(Union-Find)

    常见问题: 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共 ...

  9. 如何在Java中获取键盘输入值

    程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这 ...

  10. SELinux杂谈

    ----------------------------- 文末有推荐参考文档列表--------------------------- SELinux(Security Enhanced Linux ...