2016-01-15 3 views
2

Я добавляю некоторые пользовательские пункты меню в меню контекстного действия. Мне нужно предоставить функцию веб-поиска со словами, выбранными в WebView.Как получить выделенный текст webview в ActionMode override

Я переопределяю 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, но я couln't получить способ получить выделенный текст. Как я могу это получить, любой, пожалуйста, помогите.

Заранее спасибо.

+0

с Android API> = 19 вы можете использовать 'webview.evaluateJavascript ("(функция() {вернуться window.getSelection(). ToString()})()", новый ValueCallback () { @Override public void onReceiveValue (String value) { Log.v (TAG, "SELECTION:" + value); }}); 'В старых версиях ваш единственный курорт - это настраиваемый интерфейс javascript с единственным методом, принимающим' String', который вы должны вызывать через 'webview.loadUrl', передавая одно и то же (' js.callback (window.getSelection () .ToString()) '). – Stan

+0

@ Стань, пожалуйста, поместите его в качестве кода в ответ? –

ответ

8

Единственный способ получить выбор текста с WebView основан на javascript. Это не относится к режиму действия, так как WebView выбор текста должен быть получен в соответствии с точкой зрения разработчиков WebView. Они сознательно решили не предоставлять API для доступа к выбору текста с Java.

Решение включает в себя 2 подхода.

с 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); 
    } 
}); 

На старых строит ваш единственный курорт является пользовательским Javascript интерфейса с одним методом принимающего String, который вы должны вызвать через 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); 
    } 
} 
+0

Я проверю это и приму ответ! –

+0

Принял ответ. Большое спасибо за сохранение моей жизни :-) –

+0

Первый метод (оценкаJavascript) не работал для меня. Я делаю что-то неправильно? Я получаю пустую строку для значения в методе onRecieveValue. – clu