如何在ActionMode覆盖中获取所选的webview文本

时间:2016-01-15 03:49:29

标签: android webview actionmode

我在上下文操作菜单中添加了一些自定义菜单项。我需要使用WebView中选择的单词提供Web搜索功能。

我使用此代码覆盖ActionMode。

@Override
    public void onActionModeStarted(ActionMode mode) {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            if (mActionMode == null) {
                mActionMode = mode;
            Menu menu = mode.getMenu();

            mode.getMenuInflater().inflate(R.menu.menu_search, menu);
        }
    }
    super.onActionModeStarted(mode);
}


public void onContextualMenuItemClicked(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_search:
            //HERE I WANT TO GET THE TEXT: HOW CAN I?
            break;
    }

    if (mActionMode != null) {
        mActionMode.finish();
    }
}

我想使用webview中用户选择的单词搜索我的网站,但我无法获得所选文本。我怎么能得到那个,请任何人帮忙。

提前致谢。

1 个答案:

答案 0 :(得分:12)

WebView获取文本的唯一方法是基于javascript。这不是特定于操作模式,这是根据WebView开发人员应该检索WebView文本选择的方式。观点看法。他们故意决定不提供API来访问Java中的文本选择。

解决方案包括两种方法。

使用Android API> = 19,您可以使用evaluateJavascript

webview.evaluateJavascript("(function(){return window.getSelection().toString()})()",
new ValueCallback<String>()
{
    @Override
    public void onReceiveValue(String value)
    {
        Log.v(TAG, "SELECTION:" + value);
    }
});

在较旧的版本中,您唯一的选择是使用单个方法接受String的自定义javascript界面​​,您应该通过webview.loadUrl调用它来传递相同的内容:

webview.loadUrl("javascript:js.callback(window.getSelection().toString())");

其中js是附加的javascript界面​​:

webview.getSettings().setJavaScriptEnabled(true);
webview.addJavascriptInterface(new WebAppInterface(), "js");

public class WebAppInterface
{
    @JavascriptInterface
    public void callback(String value)
    {
        Log.v(TAG, "SELECTION:" + value);
    }
}