2012-11-23 10 views
5

Bir javascript işlevini nasıl çalıştırabiliriz ve android uygulamamızdaki geri dönüş değerini nasıl alabiliriz?Bir javascript işlevini nasıl çalıştırabiliriz ve android uygulamamızdaki bir dönüş değeri nasıl alabiliriz?

Biz bir düğmeye basın etkinliğinde bir javascript yürütmek istiyoruz, komut parametrelerini geçmek ve dönüş değerleri almak gerekir, Bu yüzden bu, uygulamak için "WebChromeClient" kullanıyorsunuz Ama İstisna var "SyntaxError geçerli: Ayrıştırma tanımsız de hatası: Aşağıdaki 1"

kodum

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.webkit.JsResult; 
import android.webkit.WebChromeClient; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 

public class FirstTab extends Activity 
{ 


    private WebView webView; 

    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.regis); 

      try{ 

       webView = (WebView) findViewById(R.id.webView1); 
       webView.getSettings().setJavaScriptEnabled(true); 
       webView.setWebChromeClient(new MyWebChromeClient()); 
       String customHtml = "<html><head><title>iSales</title><script type=\"text/javascript\"> function fieldsOnDelete(){ var x=123; return \"JIJO\"; } </script></head><body>hi</body></html>"; 
       webView.loadData(customHtml, "text/html","UTF-8"); 

       }catch(Exception e) 
       { 
        Log.v("JAC LOG",e.toString()); 
       } 

     } 
    public void onResume() 
    { 
     super.onResume(); 

      final Button button = (Button) findViewById(R.id.button1); 
      button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       try{ 
        webView.loadUrl("javascript:alert(javascript:fieldsOnDelete())"); 
       } 
       catch(Exception e) 
       { 
        Log.v("JAC LOG",e.toString()); 

       } 
       } 
      }); 
    } 


    final class MyWebChromeClient extends WebChromeClient { 
     @Override 
     public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 

     Log.v("LogTag", message); 
      result.confirm(); 
      return true; 
     } 
    } 


} 
+0

[Bu bakınız] (https://github.com/scottagarman/Android-JavaScript-Interface-Example) may o sorunu çözmek için yardımcı olur – Harish

cevap

5

Eğer yöntemi çağırmak için mWebView.loadUrl("javascript:checkName"); kullanabilirsiniz ... Sonra

size bir Java nesnesi eklemek için addJavascriptInterface() kullanabileceği başka Javascript ortamı. Java komut dosyanızın, "döndürme değerini" sağlamak için bu Java nesnesinde bir yöntem çağırmasını isteyin.

Edit1:

sizin WebView'da Bu Client ekleyin:: En java script çağrısında Şimdi

final class MyWebChromeClient extends WebChromeClient { 
     @Override 
     public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
      Log.d("LogTag", message); 
      result.confirm(); 
      return true; 
     } 
    } 

yapın:

webView.loadUrl("javascript:alert(functionThatReturnsSomething)"); 

Şimdi onJsAlert Veya aşağıdaki kesmek kullanabilirsiniz "message" araması geri verilen değeri içerecektir.

Edit2: Biz sayfa yüklendiğinde zaman alabilir çünkü URL yüklenmeye hemen çağrısından sonra JavaScript yöntemini çağırırsanız

Yani çalışmıyor. Bu yüzden bu test etmek için bir test programı oluşturdu ... Takip

olduğu varlıklar klasöründe benim html dosyası (adlandırılmış test.html) mağaza:

<html> 
<head> 
<script language="javascript"> 
    function fieldsOnDelete(message) { 
     alert("i am called with " + message); 
     window.myjava.returnValue(message + " JIJO"); 
    } 
</script> 
<title>iSales android</title> 


</head> 
<body></body> 
</html> 
</body> 
</html> 

ardından bu i alacağı benim java sınıfıdır arayüz olarak java komut dosyasına eklemek istiyorum ve dönüş değeri alacak:

public class MyJS { 

    public void returnValue(String string){ 
     Log.d(this.getClass().getSimpleName(), string); 
    } 

} 

ve aşağıdaki Etkinliğimi sınıftır:

public class CheckWebView extends Activity { 

    private WebView webView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_check_web_view); 
     webView = (WebView) findViewById(R.id.webview); 

     webView.setWebChromeClient(new WebChromeClient() { 
      @Override 
      public void onConsoleMessage(String message, int lineNumber, 
        String sourceID) { 
       super.onConsoleMessage(message, lineNumber, sourceID); 
       Log.d(this.getClass().getCanonicalName(), "message " + message 
         + " :::line number " + lineNumber + " :::source id " 
         + sourceID); 
      } 

      @Override 
      public boolean onConsoleMessage(ConsoleMessage consoleMessage) { 
       // TODO Auto-generated method stub 

       onConsoleMessage(consoleMessage.message(), 
         consoleMessage.lineNumber(), consoleMessage.sourceId()); 

       Log.d(this.getClass().getCanonicalName(), "message::::: " 
         + consoleMessage.message()); 

       return super.onConsoleMessage(consoleMessage); 
      } 
     }); 

     webView.addJavascriptInterface(new MyJS(), "myjava"); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.getSettings().setPluginsEnabled(true); 
     webView.getSettings().setAllowFileAccess(true); 

     webView.loadUrl("file:///android_asset/test.html"); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_check_web_view, menu); 
     return true; 
    } 

    /* (non-Javadoc) 
    * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem) 
    */ 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     webView.loadUrl("javascript:fieldsOnDelete('name');"); 
     return super.onOptionsItemSelected(item); 
    } 

} 

Buradaki anahtar, html dosyasının varlık klasöründen yüklenmesi ve numaralı çağrı arasında bir zaman aralığı olması gerektiğidir. İşte onOptionsItemSelected onu arıyorum ve ben onCreate() yönteminin sonuna webView.loadUrl("javascript:fieldsOnDelete('name');"); taşırsanız o

o yardımcı olur Umut ... buna fieldsOnDelete() yöntemi bulamadığını hata gösterir .. iyi çalışıyor ...

EDIT3:

kodunuzda aşağıdaki değiştirin

webView.loadUrl("javascript:alert(javascript:fieldsOnDelete())"); 

webView.loadUrl("javascript:alert(fieldsOnDelete())"); 
012 ile

ve ...

+0

URL'mız yok, javascriptimizi bir string değişkeninde kaydediyoruz. örneğin: String customHtml = " iSales fonksiyonu fieldsOnDelete() {dönüş \" Jijo \ "}"; \t \t \t weberge.loadData (customHtml, "text/html", "UTF-8"); biz excute bir ayrıştırma hatası aldık. –

+0

'mWebView.loadUrl ("javascript: checkName")' i çağırmayı deneyin; 'webView.loadData (customHtml," text/html "," UTF-8 ") çağrıldıktan sonra; –

+0

işe yaradı mı? –

4

Android KitKat'ta, dönüş değeri için geri arama özelliği olanJavascript'in yeni bir yöntemi vardır. Geri dönüş, geri döndüğünüze bağlı olarak bir JSON değerini, nesnesini veya dizisini döndürür.

 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      // In KitKat+ you should use the evaluateJavascript method 
      mWebView.evaluateJavascript(javascript, new ValueCallback<String>() { 
       @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
       @Override 
       public void onReceiveValue(String s) { 
        JsonReader reader = new JsonReader(new StringReader(s)); 

        // Must set lenient to parse single values 
        reader.setLenient(true); 

        try { 
         if(reader.peek() != JsonToken.NULL) { 
          if(reader.peek() == JsonToken.STRING) { 
           String msg = reader.nextString(); 
           if(msg != null) { 
            Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show(); 
           } 
          } 
         } 
        } catch (IOException e) { 
         Log.e("TAG", "MainActivity: IOException", e); 
        } finally { 
         try { 
          reader.close(); 
         } catch (IOException e) { 
          // NOOP 
         } 
        } 
       } 
      }); 
     } 

Burada tam bir örnek görebilirsiniz: https://github.com/GoogleChrome/chromium-webview-samples/tree/master/jsinterface-example

İlgili konular