2011-03-15 15 views
6

Así que sé que hay otras publicaciones que abordan el mismo problema, y ​​creo que las he seguido al pie de la letra pero sin éxito. Estoy intentando aprender cómo hacer que mi aplicación interactúe con JavaScript. Solo quiero poder devolver un valor de mi javascript a mi actividad.
aquí es mi actividad:Android-using addJavaScriptInterface para devolver un valor de Javascript

public class JSExample extends Activity { 
WebView mWebView; 
String mString; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mWebView = (WebView)findViewById(R.id.mWebView); 
    mWebView.addJavascriptInterface(new ClsAccessor(), "accessor"); 
    String html = getAssetsContent("jsinterface.html"); 

    mWebView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null); 

// Log.d("YO!", mString);   
} 

private String getAssetsContent(String filename){ 
    ..... 
} 

private void closeStream(BufferedReader stream) { 
    ..... 
} 

class ClsAccessor{ 
    public void setValue(String value){ 
     JSExample.this.mString = value; 
    } 
} 

Aquí está el archivo HTML cargada por mi vista Web que contiene el Javascript Quiero correr:

<!DOCTYPE html> 

<html> 
<head> 
    <script language="javascript"> 
     accessor.setValue('Hello!'); 
    </script> 
</head> 
<body> 
<h1>Testing</h1> 
</body> 
</html> 

Esto no funciona. Cuando ejecuto el código con "Log.d (" YO! ", MString);" Sin comentarios Obtengo una excepción de puntero nulo, lo que significa que el javascript nunca asignó un valor a mString. ¿Qué estoy haciendo mal?

+0

¿Está ejecutando en un problema? –

+0

oh tonto yo. sí, me encuentro con un problema. cuando la línea "Log.d (" YO! ", mString)" está descomentada, obtengo una NullPointerException, lo que significa que a mString nunca se le asignó un valor, lo que significa que no se pudo vincular javascript a java. Entonces, ¿qué estoy haciendo mal? – aamiri

Respuesta

3

Esto puede no ser correcta, voy a tener que vuelva a comprobar pero puede ser debido a la referencia que se perdió ..

Trate de hacer su referencia ClsAccessor un nivel miembro de uno ..

public class JSExample extends Activity { 
    ... 
    ClsAccessor _accessor = new ClsAccessor(); 
    ... 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     mWebView.addJavascriptInterface(_accessor, "accessor"); 
     ... 

Además, si depura línea por línea, ¿se llama alguna vez al código setValue()?

Por lo que vale, tengo el código que está haciendo como he descrito anteriormente y el script para la interfaz administrada funciona bien, sin embargo no estoy en condiciones de probar y ver si no tengo una referencia a la clase también funciona

0

Lo hago mediante la utilización de onLoadResource en mi clase de vista web. página

HTML:

<html> 
<head> 
function Submit(){ 

     var username = $('#username').val(); 
     var urlNew = 'processing.php'; 
     urlNew = urlNew + '?' + 'username=' + username; 
     $('#submit').attr('href', urlNew); 

     return true; 
    } 
</head> 
<body> 
    <form> 
     <input id="username" name="username" type="text" /> 
     <a href="" id="submit" onclick="return Submit();" ><img src="images/button.png" /></a> 
    </form> 
</body> 
</html> 

Así que en mi onLoadResource escucho a esa url:

public void onLoadResource(WebView view, String url) 
     { 
      if(url.contains("http://domain.com/processing.php")){ 

//process the url and suck out the data 

} 

esto podría no ser lo que necesita, pero había razones que tenía que hacer que esta Así que pensé que podría ayudarte. También tenga en cuenta que no hice el envío del formulario, lo hice <a>, es porque el onLoadResource no recogerá el formulario enviado.

Editar: This might help.

+0

Estoy anulado es un tipo no válido para la variable error onLoadResource cuando uso este fragmento – Rizvan

+0

¿Tiene el onLoadResource en su clase privada YourWebViewClient extiende WebViewClient {}? – bMon

2

intente habilitar Javascript en su vista web:

mWebview.getSettings().setJavaScriptEnabled(true); 
Cuestiones relacionadas