2016-11-17 114 views
0

我基本上想要从已加载到应用程序的Webview的网页中提取文本。从Webview中提取文本

就像一个试验,我用this post的方法构建了一个应用程序来计算卢比符号(₹)的出现次数。

见截图: App's Screenshot

但我不能使它发挥作用。 TextView应显示网页上的'$'符号的数量,但它保持不变。

我在Android的一个小白和高度会appritiate任何帮助:)

这是我的代码: (MainActivity)

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.webkit.JavascriptInterface; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

    static TextView count; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     count = (TextView) findViewById(R.id.textView); 

    /* An instance of this class will be registered as a JavaScript interface */ 
     class MyJavaScriptInterface { 
      @JavascriptInterface 
      @SuppressWarnings("unused") 
      public void processHTML(String html) { 
       // process the html as needed by the app 

       int occ = 0; 

       for(int i = 0 ; i < html.length() ; i++) 
        if(html.charAt(i) == '₹') 
         occ++; 

       MainActivity.count.setText(occ); 
      } 
     } 

     final WebView browser = (WebView) findViewById(R.id.browser); 

     /* JavaScript must be enabled if you want it to work, obviously */ 
     browser.getSettings().setJavaScriptEnabled(true); 

     /* Register a new JavaScript interface called HTMLOUT */ 
     browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT"); 

     /* WebViewClient must be set BEFORE calling loadUrl! */ 
     browser.setWebViewClient(new WebViewClient() { 
      @Override 
      public void onPageFinished(WebView view, String url) { 

       /* This call inject JavaScript into the page which just finished loading. */ 
       browser.loadUrl("javascript:HTMLOUT.processHTML(document.documentElement.outerHTML);"); 

      } 
     }); 

     /* load a web page */ 
     browser.loadUrl("https://www.google.co.in/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=buy+chocolate"); 
    } 
} 

回答

0

得到它的工作。两个小问题:

  1. 您正在JavaScript调用的函数中进行UI调用。这是不允许的。 更换MainActivity.count.setText(occ);

    runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         count.setText(String.valueOf(occ)); 
        } 
    }); 
    
  2. 此代码已经修复了第2期:调用setText(int)预计资源ID,所以你需要转换为字符串第一。

(您还需要从您的count声明删除static

+0

您好,感谢一吨。应用程序在进行这些更改后工作。 只有一个小问题,IDE说'occ'应该被声明为final,因为它是从内部类中访问的。 作为一个临时修复,我已经将'occ'的值存储为'final int occ2 = occ'',并将其用作'count.setText(String.valueOf(occ2));' –

+0

对,我通过移动“int occ;”来解决问题到Activity类。 –

+0

谢谢你的帮助:) –