`

为WebView加上复制文本功能

阅读更多

需求描述:   

  • 长按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

 

 

 

2
0
分享到:
评论

相关推荐

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

    本篇文章将深入探讨如何在Android WebView中实现自由复制和选择文字的功能,这对于增强用户体验至关重要,特别是对于那些包含大量文本内容的应用来说。 通常情况下,WebView默认并不支持用户直接复制文本,因此我们...

    WebView 自定义长按选择,实现收藏 / 分享选中文本

    本文将深入探讨如何在WebView中实现自定义长按选择,以及选中文本的收藏和分享功能。 首先,我们需要了解WebView的基本用法。WebView继承自View类,它可以加载HTML、CSS、JavaScript等Web内容。通过调用`loadUrl()`...

    Android-基于WebView的富文本编辑器-Android

    在Android开发中,有时我们需要为用户提供一个可以编辑和格式化的文本输入界面,这通常涉及到富文本编辑器的实现。富文本编辑器允许用户不仅能够输入文字,还能进行字体、颜色、大小、对齐方式等多样的格式设置,...

    Android webview 播放视频、文字复制

    总结,Android WebView在播放视频和复制文字方面提供了丰富的功能。通过合理的配置和编程,我们可以实现流畅的视频播放体验和便捷的文字操作。同时,注意性能和安全性的优化,以提供更好的用户体验。在实际项目中,...

    BTAndroidWebViewSelection(webview选择文字)

    `BTAndroidWebViewSelection` 是一个专门针对WebView文字选择功能的开源项目,提供了对WebView内文本的高亮、复制、分享等操作的支持。这个项目对于那些希望增强其应用程序内WebView交互性的开发者来说,具有很高的...

    简单的webview demo 带下载功能

    在Android开发中,WebView是一个非常重要的...以上就是关于“简单的webview demo 带下载功能”的核心知识点,通过这个示例,开发者可以学习到如何在Android应用中集成WebView并实现下载功能,为自己的项目提供参考。

    BTAndroidWebViewSelection(webview选择文字)安卓源码.7z

    BTAndroidWebViewSelection是一款针对安卓平台的开源项目,其主要功能是增强WebView的选择和操作功能,让用户在WebView中浏览网页时可以更加便捷地选取、复制、分享文字。在Android开发中,WebView是一个内置组件,...

    安卓Android源码——BTAndroidWebViewSelection(webview选择文字).7z

    `BTAndroidWebViewSelection`是针对WebView中文字选择功能的一个实现,通常用于用户在WebView中长按文字后弹出的复制、分享等操作。本项目可能包含了对WebView文字选择功能的优化或自定义实现。 1. **WebView的基本...

    Android BTAndroidWebViewSelection(webview选择文字).zip

    本项目“Android BTAndroidWebViewSelection(webview选择文字)”聚焦于Webview的一个关键功能——用户在Webview中选择文字,这涉及到Webview的交互和自定义功能扩展。 1. **Webview基础** Webview是Android SDK...

    BTAndroidWebViewSelection(webview选择文字).rar

    本项目“BTAndroidWebViewSelection(webview选择文字)”专注于解决一个特定的问题:在Webview中实现文本的选择和操作功能。 1. **Webview基本使用** Webview是Android SDK中的一个类,继承自View,用于加载和...

    安卓Android源码——BTWebViewSelection(webview选择文字).zip

    通过学习和理解这些知识点,开发者不仅可以实现自定义的Webview文本选择功能,还可以更好地理解和控制Webview的行为,提高应用的用户体验。在`BTAndroidWebViewSelection`项目中,你应该能找到关于如何实现这些功能...

    webview加载html文本以及PDF加载

    另外,也可以设置WebView的缩放功能,让用户自行调整。 4. **处理图片宽度**:为了适应不同屏幕尺寸,需要控制图片宽度不超过容器宽度。可以使用CSS样式`max-width: 100%;`确保图片自适应宽度,或者在加载HTML时...

    简单WebView的使用-浏览器功能

    这个“简单WebView的使用-浏览器功能”主题将深入讲解如何利用WebView构建一个基本的内置浏览器功能。 一、WebView的介绍 WebView是Android SDK中的一个类,它是基于WebKit引擎的,用于在应用程序中内嵌Web页面。...

    兼容多种功能的WebView

    本文将深入探讨“兼容多种功能的WebView”,特别是其支持JavaScript以及上传图片的能力。 首先,我们来看一下WebView的基本使用。WebView是Android SDK提供的一种视图类,通过继承自View,可以展示网页内容。创建...

    android富文本编辑器 webview

    在Android开发中,富文本编辑器是一个非常重要的组件,它允许用户进行复杂的文本编辑操作,如插入图片、改变文字颜色和字体样式等。本项目主要关注的是如何在Android应用中集成一个基于Webview的富文本编辑器。...

    2021-学习相关-BTAndroidWebViewSelection(webview选择文字).zip

    这个项目主要探讨了如何在Android应用中实现WebView组件的文本选择、复制和分享功能,这对于开发者来说是一个非常实用的功能,特别是对于那些需要在应用内集成网页浏览体验的应用。 在Android开发中,WebView是一个...

    crosswalk-webview比webview更好用

    2. **富文本支持**:对于需要显示复杂富文本内容的应用来说,Crosswalk-WebView提供了更好的支持。它可以处理各种CSS3效果、WebGL、WebSocket等现代Web技术,使得富文本网页能够得到充分展示。 3. **版本兼容性**:...

    使用WebView实现浏览器功能

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内嵌入网页浏览功能,无需离开应用即可访问互联网内容。本教程将详细讲解如何利用WebView实现一个简单的浏览器功能,包括输入URL、打开网页以及...

    BTWebViewSelection(webview选择文字).zip

    总结起来,`BTWebViewSelection(webview选择文字)`是一个专注于增强Android Webview文本选择功能的模块,包括自定义选中样式、复制文本、扩展功能以及性能优化等多个方面,旨在提升用户在Webview中操作文本的便捷...

Global site tag (gtag.js) - Google Analytics