簡體   English   中英

如何從android中的webview獲取選定的文本?

[英]How can I get selected text from webview in android?

我需要從webview獲取選定的文本。

為此,我輸入了以下內容:

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

在我的觸摸事件中。

  1. 觸摸事件效果很好
  2. Android.getHtml運作良好(這是javascriptinterface方法)
  3. window.getSelection沒有任何值:這是問題所在->在我的視圖中,當我在webview中觸摸一個單詞時,window.getSelection應該自動包含文本。 我錯了嗎?

有沒有人對此有想法?

提前非常感謝。

附:以下是我的整個代碼


@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;
}

對於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);
    }
});

對於<19的API,您可以使用evaluateJavascript loadUrl使用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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM