效果图如下
文章末尾会贴出GitHub源码,欢迎star
注:选中的文字有时候需要取消选中
webview.clearMatches();//取消已经选中的webview里的文字webView.clearFocus();//移除高亮显示,如果不移除在三星s6手机上会崩溃
public class MainActivity extends AppCompatActivity {
private WebView webView;
MenuItem.OnMenuItemClickListener handler;
private ActionMode mActionMode = null;
String TAG = MainActivity.class.getName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
String url = "file:///android_asset/demo.html";
webView.loadUrl(url);
//用来监听Contextual Action Bar的点击事件
handler = new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
// do the menu action
switch (item.getItemId()) {
case 1:
//这里调取你自己的分享界面
Log.i("you click", "分享");
webText();
if (mActionMode != null) {
mActionMode.finish();
webView.clearFocus();//移除高亮显示,如果不移除在三星s6手机上会崩溃
}
break;
case 2:
//获取剪贴板管理器:
ClipboardManager cm = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
// 创建普通字符型ClipData
ClipData mClipData = ClipData.newPlainText("Label", "这里是你要放入剪切板的文字,
可以是你获取到的webview中长按选中的文字");
// 将ClipData内容放到系统剪贴板里。
cm.setPrimaryClip(mClipData);
break;
}
return true;
}
};
}
//调用h5的js接口,通过js的getValue()获取选中文字,这个js方法让h5工程师加到网页中
@TargetApi(Build.VERSION_CODES.KITKAT)
private void webText() {
webView.evaluateJavascript("getValue()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.e(TAG, "youclickvalue=" + value);
Toast.makeText(MainActivity.this, "你要分享的文案是:" + value, Toast.LENGTH_SHORT).show();
}
});
}
/*看一看menu.add方法的参数:
第一个int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单按钮。
第二个int类型的item ID参数,代表的是项目编号。这个参数非常重要,一个item ID对应一个menu中的选项。在后面使用菜单的时候,就靠这个item ID来判断你使用的是哪个选项。
第三个int类型的order ID参数,代表的是菜单项的显示顺序。默认是0,表示菜单的显示顺序就是按照add的显示顺序来显示。
第四个String类型的title参数,表示选项中显示的文字。*/
//重写弹出Contextual Action Bar
@Override
public void onActionModeStarted(ActionMode mode) {
if (mActionMode == null) {
mActionMode = mode;
Menu menu = mode.getMenu();
menu.clear();
menu.add(0, 1, 0, "我的分享").setOnMenuItemClickListener(handler);
menu.add(0, 2, 0, "复制").setOnMenuItemClickListener(handler);
}
super.onActionModeStarted(mode);
}
@Override
public void onActionModeFinished(ActionMode mode) {
mActionMode = null;
webView.clearFocus();//移除高亮显示,如果不移除在三星s6手机上会崩溃
super.onActionModeFinished(mode);
}
}
下面简单贴出h5代码
主要是通过window.getSelection().toString()获取到选中的内容
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
function getValue(){
return window.getSelection().toString();
}
</script>
</head>
<body>
<p>啊搜狐打工的湖广会馆贷后管理黑咕隆咚会干货</p>
<p>啊搜狐打工的湖广会馆贷后管理黑咕隆咚会干货</p>
<p>啊搜狐打工的湖广会馆贷后管理黑咕隆咚会干货</p>
<p>啊搜狐打工的湖广会馆贷后管理黑咕隆咚会干货</p>
<p>啊搜狐打工的湖广会馆贷后管理黑咕隆咚会干货</p>
<p>啊搜狐打工的湖广会馆贷后管理黑咕隆咚会干货</p>
<p>啊搜狐打工的湖广会馆贷后管理黑咕隆咚会干货</p>
<p>啊搜狐打工的湖广会馆贷后管理黑咕隆咚会干货</p>
<p>啊搜狐打工的湖广会馆贷后管理黑咕隆咚会干货</p>
<p>啊搜狐打工的湖广会馆贷后管理黑咕隆咚会干货</p>
</body>
</html>
GitHub源码地址: https://github.com/qiushi123/WebViewShareText