2017-07-04 58 views
0

我需要从webview中获取选定的文本。如何从android中的webview中获取选定的文本?

对于这一点,我把这个:

webView.loadUrl("javascript:Android.getHtml(window.getSelection().toString())"); 

在我的触摸事件。

  1. 触摸事件行之有效
  2. Android.getHtml效果很好(这是javascriptinterface法)
  3. window.getSelection没有任何价值:它的问题 - >在我看来,当我摸到在网页视图一句话,窗口.getSelection自动应该包含文本。我错了吗?

有没有人可以对此有所了解?

非常感谢提前。

PS:下面是我的整个代码


@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_each_news, container, false); 

    //설정된 인자값을 받는다 
    String newsAddress = getArguments().getString("newsAddress"); 

    //Start : 받은 주소로 웹뷰를 띄운다... 
    webView = (WebView) rootView.findViewById(R.id.webView); 
    // webView.setWebViewClient(new WebViewClient()); 

    webView.setWebViewClient(new WebViewClient() {}); 

    webSettings = webView.getSettings(); 

    webSettings.setJavaScriptEnabled(true);  //자바스크립트 허용여부 
    webSettings.setLoadWithOverviewMode(true); //웹페이지 웹뷰크기에 맞추기 위한 설정 
    webSettings.setUseWideViewPort(true); //웹페이지 웹뷰크기에 맞추기 위한 설정 
    webView.setInitialScale(1); //웹페이지 웹뷰크기에 맞추기 위한 설정 

    webView.addJavascriptInterface(new MyJavascriptInterface(), "Android"); //자바스크립트 인터페이스 메소드 등록 

    //url 호출 
    webView.loadUrl(newsAddress); 
    webView.setOnTouchListener(this); 
    //End : 받은 주소로 웹뷰를 띄운다... 

    return rootView; 
} 

@RequiresApi(api = Build.VERSION_CODES.KITKAT) 
@Override 
public boolean onTouch(View view, MotionEvent motionEvent) { 

    switch (motionEvent.getAction()) { 
     case MotionEvent.ACTION_DOWN: { 
      // Toast.makeText(getContext(),"웹뷰클릭",Toast.LENGTH_LONG).show(); 
      pressStartTime = System.currentTimeMillis(); 
      pressedX = motionEvent.getX(); 
      pressedY = motionEvent.getY(); 
      stayedWithinClickDistance = true; 
      break; 
     } 
     case MotionEvent.ACTION_MOVE: { 

      if (stayedWithinClickDistance && getDistance(pressedX, pressedY, motionEvent.getX(), motionEvent.getY()) > MAX_CLICK_DISTANCE) { 
       stayedWithinClickDistance = false; 
      } 
      break; 
     } 
     case MotionEvent.ACTION_UP: { 
      long pressDuration = System.currentTimeMillis() - pressStartTime; 
      if (pressDuration < MAX_CLICK_DURATION && stayedWithinClickDistance) { 
       // 클릭처리 
       webView.evaluateJavascript("(function(){return window.getSelection().toString()})()", 
         new ValueCallback<String>() 
         { 
          @Override 
          public void onReceiveValue(String value) 
          { 
           Log.v(TAG, "SelectedText:" + value); 
          } 
         }); 
      } 
     } 
    } 
    return false; 
} 
+0

你对测试哪个版本的Android? –

+0

我是android编程新手。你的意思是API版本?我是API 22.感谢您的关注 – Ted

回答

0

对于API> = 19可以使用evaluateJavascript

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

对于API < 19可以使用evaluateJavascript使用loadUrl方法如下所示:

mWebview.getSettings().setJavaScriptEnabled(true); 
mWebview.addJavascriptInterface(new JavaScriptInterface(), "javascriptinterface"); 

然后,当你想选择使用:

mWebview.loadUrl("javascript:javascriptinterface.callback(window.getSelection().toString())");

而且如下定义WebAppInterface类:

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

我也已经使用了“evaluateJavascript”。只要我知道,它仅用于简单的界面。问题是,无论我使用什么,这个window.getSelection()JavaScript函数不起作用。 – Ted

+0

你能用你的代码更新你的问题吗? –

+0

我上传了大部分代码。触摸事件效果很好,但我得到了这个日志:SelectedText:“”,尽管我在webview中触摸了一个单词。感谢您的关注 – Ted

相关问题