Android WebView另类实现 自由复制进入选择文字模式


-
Android WebView实现自由复制文字
急求! webView长按的自由复制功能怎么手动调用和修改_course
2014-12-09项目要做一个杂志阅读器,目前的思路是用html排版,webView显示,现在要做收藏、笔记、书签之类的功能。 想在系统自由复制的基础上改造,加上这些功能,现在我找不到系统是在哪里调这个功能的,2天了毫
WebView如何实现复制功能 ?_course
2012-03-27想实现WebView的复制功能,目前最大的问题时无法实现“文本选择”。 谁能帮忙给段代码,实现一下WebView中“文本选择”?
21.67MB
WebView 自定义长按选择,实现收藏 / 分享选中文本
2017-06-27自定义WebView页面中,长按文本的弹出选项、点击选择后,分享、转发、收藏选择文本
Android 继承BridgeWebView 写个自定义的webview。部分手机加载高度为0_course
2019-10-21public class AdWebView extends com.github.lzyzsd.jsbridge.BridgeWebView { private Context mContext; private MoonthimpModel moonthimpModel; private boolean messageHeight; private String mTitle; private PregressChange pregressChange; public AdWebView(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = context; TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AdWebView); messageHeight = a.getBoolean( R.styleable.AdWebView_messageHeight, false); } public void setPregressChange(PregressChange pregressChange) { this.pregressChange = pregressChange; } public AdWebView(Context context) { super(context); this.mContext = context; } Mobile mobile = new Mobile(); public void initWebView(String url) { WebSettings webSettings = getSettings(); //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript webSettings.setJavaScriptEnabled(true); //设置自适应屏幕,两者合用 webSettings.setDomStorageEnabled(true); // 解决Android 5.0上Webview默认不允许加载Http与Https混合内容 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //两者都可以 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } //设置自适应屏幕,两者合用 webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小 webSettings.setLoadWithOverviewMode(true);// 缩放至屏幕的大小 webSettings.setAllowFileAccess(true); //设置可以访问文件 webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口 webSettings.setLoadsImagesAutomatically(true);//支持自动加载图片 webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式 addJavascriptInterface(this, "Android_kks"); if (messageHeight) { addJavascriptInterface(mobile, "mobile"); } if (Build.VERSION.SDK_INT >= 19) { getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); } //设置不用系统浏览器打开,直接显示在当前Webview setWebViewClient(new BridgeWebViewClient(this) { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); LogUtils.e("onPageFinished"); if (messageHeight) { mobile.onGetWebContentHeight(); } } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { // super.onReceivedSslError(view, handler, error); 父类的默认处理方式,内部是handler.cancel(),必须去除 handler.proceed();// 接受所有网站的证书 // handleMessage(Message msg);// 进行其他处理 } }); setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { if (pregressChange != null) { if (newProgress == 100) { //加载完毕进度条消失 pregressChange.onComplete(); } else { //更新进度 pregressChange.onProgress(newProgress); } } super.onProgressChanged(view, newProgress); } @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); if (title != null && pregressChange != null) { // pregressChange.onTitle(title); } } }); loadUrl(url); // loadUrl("https://h5.ruiccm.com/testls/190627/index.html"); // loadUrl("file:///android_asset/demo1.html"); String localVersion = ""; try { PackageInfo packageInfo = KeKeShiApp.getApp() .getPackageManager() .getPackageInfo(KeKeShiApp.getApp().getPackageName(), 0); localVersion = packageInfo.versionName; LogUtils.d("TAG", "本软件的版本号。。" + localVersion); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } AdUserInfoBean src = new AdUserInfoBean(); src.setDevice_uuid(PushAgent.getInstance(mContext).getRegistrationId()); if (AppSharedPrefs.getUserInfo() != null && AppSharedPrefs.getUserInfo().getUserinfo() != null && AppSharedPrefs.getUserInfo().getUserinfo().getTel() != null) { UserBean.UserInfo userinfo = AppSharedPrefs.getUserInfo().getUserinfo(); src.setPhoneNum(userinfo.getTel()); src.setBabybirthday(userinfo.getBabybirthday()); src.setBabyname(userinfo.getBabyname()); src.setBabysex(userinfo.getBabysex()); src.setIsvip((AppSharedPrefs.getUserInfo().getIsvip() ? 1 : 0) + ""); src.setMoonage(userinfo.getMoonage()); src.setRelative(userinfo.getRelative()); src.setUser_uuid(userinfo.getUuid()); } src.setDeviceid(PushAgent.getInstance(mContext).getRegistrationId()); src.setVersion(localVersion); src.setPhone_type("Android"); src.setPhone_version(SystemUtil.getSystemModel() + "," + SystemUtil.getSystemVersion()); //有方法名的都需要注册Handler后使用 registerHandler("userInfo", new BridgeHandler() { @Override public void handler(String data, CallBackFunction function) { Log.i("liuw", "html返回数据为:" + data); function.onCallBack("Native已经接收到数据:" + data + ",请确认!"); } }); //应用启动后初始化数据调用,js处理方法connectWebViewJavascriptBridge(function(bridge) callHandler("userInfo", new Gson().toJson(src), new CallBackFunction() { @Override public void onCallBack(String data) { Log.e("callbace", "successs"); } }); } public String getmTitle() { return mTitle; } private class Mobile { @JavascriptInterface public void onGetWebContentHeight() { post(new Runnable() { @Override public void run() { measure(0, 0); int measuredHeight = getMeasuredHeight(); LogUtils.d("measuredHeight", measuredHeight + ""); SharedPreferences kekeshi = mContext.getSharedPreferences("kekeshi", MODE_PRIVATE); if (measuredHeight != 0) { kekeshi.edit().putInt("measuredHeight", measuredHeight).commit(); } LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) getLayoutParams(); params.height = measuredHeight; if (measuredHeight == 0) { int measuredHeight1 = kekeshi.getInt("measuredHeight", 4000); params.height = measuredHeight1; } params.weight = LinearLayout.LayoutParams.MATCH_PARENT; setLayoutParams(params); } }); } } public void close() { stopLoading(); clearHistory(); removeAllViews(); destroy(); } public void resume() { // resumeTimers(); // onResume(); } public void pause() { // onPause(); // pauseTimers(); } public void load(String url) { initWebView(url); } public interface PregressChange { void onComplete(); void onProgress(int progress); void onTitle(String title); } ``` ```
android webview开发中的复制问题_course
2012-06-13在android 的webView开发中,我现在加载一个网页,网页就有选择文本内容后获取到内容赋值给文本框的功能。但我在webView里加载这个网页后选择文本内容就没有这个功能了。我想要获得webvi
webview上实现这种长按后选择文字,还有相应的菜单功能_course
2016-01-15有没有大神做过在安卓webview上实现这种长按后选择文字,还有相应的菜单功能
大数据的入门视频教程
2018-07-26大数据技术入门视频课程,会从基础思想和原理架构开始,全面介绍大数据的思想体系和架构,为学员进一步学习大数据奠定良好的基础。内容涉及大数据的核心问题、大数据核心思想,Google的三篇论文、GFS,Google的分布式文件系统,MapReduce,BigTable、Hadoop和Spark生态体系以及具体应用演示。
8小时Python零基础轻松入门
2020-05-20
-
博客
LCA问题——倍增算法,Tarjan算法讲解
LCA问题——倍增算法,Tarjan算法讲解
-
博客
黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)——部分题解
黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)——部分题解
-
学院
Selenium3分布式与虚拟化
Selenium3分布式与虚拟化
-
博客
LockSupport
LockSupport
-
学院
单片机完全学习课程全五季套餐
单片机完全学习课程全五季套餐
-
博客
春节灯笼Html代码实现+点击页面出现文字
春节灯笼Html代码实现+点击页面出现文字
-
学院
2021最新Kubernetes(k8s)集群实战精讲
2021最新Kubernetes(k8s)集群实战精讲
-
学院
hadoop自动化运维工具Ambari应用实践
hadoop自动化运维工具Ambari应用实践
-
下载
智能温度检测控制系统设计.zip
智能温度检测控制系统设计.zip
-
学院
21年新消息队列RabbitMQ视频教程AMQP教程
21年新消息队列RabbitMQ视频教程AMQP教程
-
博客
python3 动态规划 leetcode 连续子数组的最大和
python3 动态规划 leetcode 连续子数组的最大和
-
下载
JavaFX:项目实战——贪吃蛇
JavaFX:项目实战——贪吃蛇
-
下载
呼和浩特市国土空间总体规划及专题研究和技术文件
呼和浩特市国土空间总体规划及专题研究和技术文件
-
下载
Sim_EKB_Install_2020_10_10.zip
Sim_EKB_Install_2020_10_10.zip
-
下载
狂雨小说采集规则1.txt
狂雨小说采集规则1.txt
-
学院
手势解锁-canvas-javascript实战
手势解锁-canvas-javascript实战
-
博客
674. 最长连续递增序列
674. 最长连续递增序列
-
下载
正确小程序全开源独立版.zip
正确小程序全开源独立版.zip
-
学院
【数据分析-随到随学】数据分析基础及方法论
【数据分析-随到随学】数据分析基础及方法论
-
博客
【Django Rest framework】Serializers fields 篇翻译及应用举例
【Django Rest framework】Serializers fields 篇翻译及应用举例
-
博客
PHP7.2源码安装
PHP7.2源码安装
-
博客
PHP 完整表单实例
PHP 完整表单实例
-
下载
httpclient支持jar打包
httpclient支持jar打包
-
博客
centOS安装PHP后,php-fpm启动失败的解决
centOS安装PHP后,php-fpm启动失败的解决
-
学院
跟我练内测小分队学习礼包
跟我练内测小分队学习礼包
-
博客
POJ - 2386 Lake Counting
POJ - 2386 Lake Counting
-
学院
【数据分析-随到随学】互联网行业业务指标及行业数
【数据分析-随到随学】互联网行业业务指标及行业数
-
博客
install Jekyll and Bundler for Github page on Ubuntu
install Jekyll and Bundler for Github page on Ubuntu
-
下载
软件设计实践.doc
软件设计实践.doc
-
博客
Matplotlib scatter 散点图
Matplotlib scatter 散点图