2

Ich habe auf Google und Stackoverflow gesucht, kann aber keine Lösungen für Android API 17 und höher finden.On Button Klicken Sie auf Inhalte aus einem WebView-Textbereich Android

Ich möchte Daten aus einer Webansicht auf Button klicken.

Ich mag etwas Ähnliches, was ios erreichen hat:

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

mein Quellcode ist:

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/ besagt, dass der Konstruktor

veraltet

Dieser Konstruktor war In der API-Stufe 17 nicht mehr unterstützt. Das private Surfen wird nicht mehr direkt über unterstützt WebView und wird in einer zukünftigen Version entfernt werden. Verwenden Sie vorzugsweise WebSettings, WebViewDatabase, CookieManager und WebStorage für eine fein abgestimmte Kontrolle von Datenschutzdaten.

Webview haben Textarea, so kann ich etwas nach dem Schreiben schreiben ich will in der Lage sein, Daten auf Knopf klicken. Eigentlich bin ich in der Lage, Daten über die Ladezeit von Webview zu erhalten, aber nicht in der Lage, Daten über den Buttonklick nach dem Schreiben auf Textarea in Webview zu erhalten.

Ich fand eine mögliche Lösung, aber ich bin nicht in der Lage, irgendwelche Daten über das Klicken auf die Schaltfläche zu erhalten.

Die Lösung lautet:

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(); 

     } 
    } 

} 

jede Hilfe sehr geschätzt wird.

+2

https://github.com/henrychuangtw/WebView-Javascript-Inject – HenryChuang

Antwort

2

Ich bin wirklich glücklich Antwort

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

    } 
0
  1. Enable javascript
  2. Add your own javascript
  3. Ihre eigenen webviewClient Registrieren und überschreibt die onPageFinished ein wenig Javascript
  4. Im Javascript einzufügen, die element.innerText des Tags, erwerben und es zu einem Javascript passieren Schnittstelle.
+0

Ich brauche komplette Lösung nicht Erklärung zu geben? –

Verwandte Themen