- 浏览: 231210 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (101)
- Practice (17)
- Model (15)
- Prototype (2)
- Integration (6)
- GWT (3)
- Android (16)
- Lab (6)
- Ubuntu (4)
- Data Structure(D,S) (1)
- 社会观察员 (1)
- python (14)
- redis (0)
- mysql (9)
- php (0)
- Data Structure(D (1)
- haproxy (2)
- Shell (5)
- Zabbix (1)
- CentOS (1)
- sqlplus (1)
- rlwrap (1)
- Oracle (2)
- schema (2)
- user (1)
- accredit (1)
- Delphi (2)
- nagios (1)
- nginx (0)
最新评论
-
白云飞:
兄弟能不能发一份完整的源码到我邮箱?luochengwei20 ...
【Python真的很强大】程序Log实时监控 -
myreligion:
nice job!
解决一个棘手的bug: java.lang.NoClassDefFoundError: android.os.AsyncTask -
yw9002:
你这个貌似提交的时候整个页面都会刷新。
AjaxAnyWhere+Struts的一个应用(demo/feature crew) -
fkpwolf:
这总结偏向于细节了,流水账
Android app项目和开发总结 -
crazybull:
期待详细总结~~~
Android app项目和开发总结
需求描述:
- 长按WebView出现Context menu,显示"复制”菜单
- 点击上述菜单后选择文本,复制到剪贴板
概要设计+详细设计:
- 用OnTouchListener实现长按实现(参照android.view.View)
- 实现WebView的Context menu(在Activity实例中实现)
- 实现复制文本功能(兼容多个sdk)
编码:
public class WebViewCopy { private Activity activity; private WebView webview; private static boolean mIsSelectingText; public static final String TAG=WebViewCopy.class.getSimpleName(); public WebViewCopy(final Activity activity, final WebView webView){ this.webview=webView; this.activity=activity; this.activity.registerForContextMenu(this.webview); webView.requestFocus(View.FOCUS_DOWN); webView.setOnTouchListener(new OnTouchListener() { boolean mHasPerformedLongPress; Runnable mPendingCheckForLongPress; @Override public boolean onTouch(final View v, MotionEvent event) { /* webView.getSettings().setBuiltInZoomControls(false); webView.getSettings().setSupportZoom(false);*/ Log.d(TAG, "event:" + event.getAction()); switch (event.getAction()) { case MotionEvent.ACTION_UP: mIsSelectingText = false; if (!v.hasFocus()) { v.requestFocus(); } if (!mHasPerformedLongPress) { // This is a tap, so remove the longpress check if (mPendingCheckForLongPress != null) { v.removeCallbacks(mPendingCheckForLongPress); } // v.performClick(); } break; case MotionEvent.ACTION_DOWN: if (!v.hasFocus()) { v.requestFocus(); } if( mPendingCheckForLongPress == null) { mPendingCheckForLongPress = new Runnable() { public void run() { //((WebView)v).performLongClick(); if(! mIsSelectingText) { activity.openContextMenu(webview); mHasPerformedLongPress = true; mIsSelectingText = false; } } }; } mHasPerformedLongPress = false; v. postDelayed(mPendingCheckForLongPress, ViewConfiguration.getLongPressTimeout()); break; case MotionEvent.ACTION_MOVE: final int x = (int) event.getX(); final int y = (int) event.getY(); // Be lenient about moving outside of buttons int slop = ViewConfiguration.get(v.getContext()).getScaledTouchSlop(); if ((x < 0 - slop) || (x >= v.getWidth() + slop) || (y < 0 - slop) || (y >= v.getHeight() + slop)) { if (mPendingCheckForLongPress != null) { v. removeCallbacks(mPendingCheckForLongPress); } } break; default: return false; } return false; } }); } public static synchronized void emulateShiftHeld(WebView view) { try { KeyEvent shiftPressEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT, 0, 0); shiftPressEvent.dispatch(view); } catch (Exception e) { Log.e(TAG, "Exception in emulateShiftHeld()", e); } } public synchronized void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo,final int copy,String menuString) { MenuItem menuitem=menu.add(1, copy, Menu.NONE, menuString); menuitem.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if(item.getItemId()==copy){ //emulateShiftHeld(webview); selectAndCopyText(webview); } return false; } }); } public static synchronized void selectAndCopyText(WebView v) { try { mIsSelectingText = true; //Method m = WebView.class.getMethod("emulateShiftHeld", Boolean.TYPE); // m.invoke(v, false); if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR) { Method m = WebView.class.getMethod("emulateShiftHeld", Boolean.TYPE); m.invoke(v, false); } else { Method m = WebView.class.getMethod("emulateShiftHeld"); m.invoke(v); } } catch (Exception e) { // fallback emulateShiftHeld(v); }finally{ //Toast.makeText(activity, "Select text", Toast.LENGTH_SHORT).show(); } } }
下面的代码在activity中写:
1) 在onCreate中生成 WebViewCopy 实例: copy = new WebViewCopy(this, _webView);
2) 在onCreateContextMenu中注入复制菜单public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) { copy.onCreateContextMenu(menu, v, menuInfo,COPY,getString(R.string.copy)); super.onCreateContextMenu(menu, v, menuInfo); }
回顾与总结:
OnTouchListener可能在一些时候更本不响应,如Zoom Button出现后。这得让WebView重新获取焦点,
这是WebView又一已知的Bug. 整个难点在于重新获取焦点: webview.requestFocus();
参考: http://code.google.com/p/android/issues/detail?id=7189
发表评论
-
解决一个棘手的bug: java.lang.NoClassDefFoundError: android.os.AsyncTask
2012-04-03 15:58 8748这个Bug发生在这样的环境: 你有很多的 ... -
线程阻塞队列的处理
2012-02-16 21:38 1450在日常事务中,我们常常依次做如下操作: 排队取得一个单 ... -
细数Android Bug
2012-01-26 16:12 2784咱们的三、四岁孩子:Android有些问题。现罗列一下 ... -
为Notification自定义铃声
2012-01-21 10:53 2664如下是为Notification自定义铃声的部分片段 ... -
WebView使用总结
2012-01-21 10:30 3497以下是使用WebView过程中的部分场景和解决 ... -
Drawable示例
2011-01-26 13:14 1372继上 ,完善几个Drawable示例. ... -
Android app项目和开发总结
2011-01-15 21:02 1984关键字 : android app, android ... -
Frame布局FrameLayout & Frame动画AnimationDrawable 应用实例
2010-12-20 23:05 17491)FrameLayout常常与 merge 相关,关于他 ... -
两个铁球同时落地
2010-12-11 15:22 1221这是一篇"在比萨斜塔上模拟两个铁球同时落地&qu ... -
用代理模式处理海量高频数据更新
2010-11-28 23:40 1031业务背景: 海量高频数据(如股票实时报价), 更新的规则: 被 ... -
个性化(Style/Theme)之ListView
2010-10-15 16:09 28431)Item分隔栏 只需要在Adapter中Overrid ... -
用户友好体验之ListView分页
2010-10-14 16:17 1538先贴上操作画面。其中最后一个条目是下列三者中其一。 < ... -
退出App的解决方案
2010-10-14 14:13 2562页面(activity)太多,要完全退出app基本 ... -
让用户不再遭遇ANR
2010-07-01 12:27 1508ANR简介 Android有专门的Thread ... -
TableRow数据更新时加上高亮背景
2010-06-04 11:30 1916一般Table的数据(行)更新时,要配合一定的动画效果 ...
相关推荐
Android WebView实现自由复制文字
Android webview 播放视频、文字复制
自定义WebView页面中,长按文本的弹出选项、点击选择后,分享、转发、收藏选择文本
基于WebView的富文本编辑器 - Android
简单的一个webview demo,代码不多具有下载功能可以学习看看
含js,上传图片功能的webview
简单WebView的使用,可以实现浏览器的网页的功能。
BTAndroidWebViewSelection(webview选择文字).rar
三个Button,一个EditText,一个WebView实现输入网址打开网址,返回后退功能
webview图片上传功能及中文路径问题
webview图片上传功能
本demo分为两部分,可以从主页两个按钮切换 第一部分是webview加文本,主要有调整字体大小和图片宽度 第二部分是应用内加载PDF
BTAndroidWebViewSelection(webview选择文字)源代码,是一个很不错的Android源码,有兴趣的伙伴们抽时间可以看一下把
android webview视频全屏等功能demo
BTAndroidWebViewSelection(webview选择文字)安卓源码.7z
Android BTAndroidWebViewSelection(webview选择文字).zip
Android富文本编辑器+WebView显示
uniapp 使用webView通讯
安卓Android源码——BTWebViewSelection(webview选择文字).zip
调试基于WebView的App最舒服的工具Chrome自带的开发者工具,其中有我们熟悉的Dom树调试,JS调试,Network监视等等功能。 Google提供的调试Android上WebView的步骤: 1.开启手机上的USB调试功能并且连接计算机手机端...