按钮单击从WebView textarea Android获取内容

时间:2016-04-13 08:08:34

标签: android webview android-support-library android-4.4-kitkat

我在google和stackoverflow上搜索过但无法找到与Android API 17及更高版本相关的任何解决方案。

我喜欢在Button Click上从webview中检索数据。

我喜欢实现与ios类似的东西:

myText.stringByEvaluatingJavaScriptFromString
    ("document.getElementById('chapter-description').value")

我的源代码是:

package com.xyz.webviewtest;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

public class MainActivity4 extends AppCompatActivity {
    TextView textView;

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

        final WebView webview = (WebView) findViewById(R.id.webView);
        webview.getSettings().setJavaScriptEnabled(true);

        webview.addJavascriptInterface(new MyJavaScriptInterface(this), "HtmlViewer");

        webview.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                webview.loadUrl("javascript:window.HtmlViewer.showHTML" +
                        "('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");

            }
        });
       // new MyJavaScriptInterface(this).showHTML("HtmlViewer");

        webview.loadUrl("http://www.xsoftech.com");
    }

    class MyJavaScriptInterface {

        private Context ctx;

        MyJavaScriptInterface(Context ctx) {
            this.ctx = ctx;
        }

        public void showHTML(String html) {
            new AlertDialog.Builder(ctx).setTitle("HTML").setMessage(html)
                    .setPositiveButton(android.R.string.ok, null).setCancelable(false).create().show();
        }

    }
}

http://developer.android.com/表示不推荐使用构造函数

  

这个构造函数在API级别17中已弃用。私有浏览是   不再直接通过WebView支持,将被删除   未来发布。喜欢使用WebSettings,WebViewDatabase,   CookieManager和WebStorage可以对隐私数据进行细粒度控制。

Webview有textarea所以我可以在写完之后写一些东西,我希望能够获得点击按钮的数据。实际上,我能够获得关于webview的加载时间的数据,但是在webview中写入textarea之后无法获得按钮点击的数据。

我找到了一个可能的解决方案,但我无法获得有关按钮点击的任何数据。

解决方案是:

    package example.xsoftech.sample;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;


public class Main2 extends Activity {
    WebView webview1;
    public static String data;
    Button button;
    String sUrl = "http://www.facebook.com/";

    // String sUrl = "http://www.xsoftech.com";



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

        button = (Button)findViewById(R.id.button);

         webview1 = (WebView)findViewById(R.id.myWebview);

         webview1.getSettings().setJavaScriptEnabled(true);
          webview1.addJavascriptInterface(new MyJavaScriptInterface(), "MYOBJECT");

        //FIXME I want to get value on button click but it's not working.So plz give me solution for work it?
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(Main2.this, "click is done: "+data, Toast.LENGTH_SHORT).show();
                data= "";
                webview1.loadUrl(sUrl);
            }
        });


        webview1.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Log.d("lifecyle", "shouldOverrideUrlLoading");

                view.loadUrl(url);
                return true;
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                Log.d("lifecyle", "onpagefinished");
                StringBuilder sb = new StringBuilder();



                sb.append("document.getElementsByTagName('form')[0].onsubmit = function () {");
                sb.append("var objPWD, objAccount;var str = '';");
                sb.append("var inputs = document.getElementsByTagName('input');");
                sb.append("for (var i = 0; i < inputs.length; i++) {");
                sb.append("if (inputs[i].type.toLowerCase() === 'password') {objPWD = inputs[i];}");
                sb.append("else if (inputs[i].name.toLowerCase() === 'email') {objAccount = inputs[i];}");
                sb.append("}");
                sb.append("if (objAccount != null) {str += objAccount.value;}");
                sb.append("if (objPWD != null) { str += ' , ' + objPWD.value;}");
                sb.append("window.MYOBJECT.processHTML(str);");
                sb.append("return true;");
                sb.append("};");

                view.loadUrl("javascript:" + sb.toString());

            }

        });


        webview1.loadUrl(sUrl);

    }

    class MyJavaScriptInterface
    {
        @JavascriptInterface
        public void processHTML(String html)
        {
            data = html;
            AlertDialog.Builder builder = new AlertDialog.Builder(Main2.this);
            builder.setTitle("AlertDialog from app")
                    .setMessage(html)
                    .setPositiveButton(android.R.string.ok,
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    // TODO Auto-generated method stub

                                }
                            })
                    .setCancelable(false).show();

        }
    }

}

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我很乐意回答

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

        button = (Button)findViewById(R.id.button);

        final WebView browser = (WebView)findViewById(R.id.myWebview);
/* 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:window.HTMLOUT.processHTML(document.getElementsByTagName('textarea')[0].innerHTML);");
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                browser.loadUrl("javascript:window.HTMLOUT.processHTML(document.getElementById('chapter-description').value);");
            }
        });

/* load a web page */
        browser.loadUrl(sUrl);

    }

答案 1 :(得分:0)

  1. Enable javascript
  2. Add your own javascript
  3. 注册您自己的webviewClient,覆盖onPageFinished以插入一些javascript
  4. 在javascript中,获取标签的element.innerText,并将其传递给您的javascript界面​​。