2017-07-04 187 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

相關問題