# Android WebView HTML Input



## FreshD (3. Mrz 2012)

Hallo Leute!

ich möchte auf einer Website, die in meiner App mit WebView aufgerufen wird ein Suchen-Feld fülllen.
Leider besitzt dieses Feld obendrauf keine ID:
<input type="text" size="12" value="" name="keyword">

Hat irgend wer eine Idee?
Lg FreshD


----------



## schlingel (4. Mrz 2012)

Mit XPath oder Dom das Element selektieren. XPath dafür wäre z.B. \\input[name='keyword']


----------



## FreshD (4. Mrz 2012)

danke für die antwort, hätte du vlt lust mir mal auf die sprünge zu helfen?


```
setContentView(R.layout.webview);
			webViewActivated = true;
			setWebView((WebView) findViewById(R.id.webview));
			getWebView().getSettings().setJavaScriptEnabled(true);
			getWebView().loadUrl(url);

			getWebView().setWebViewClient(new openWebViewClient());
```

so sieht der code ungefähr aus...
wo soll ich den aufruf jetzt machen?


----------



## schlingel (4. Mrz 2012)

Du brauchst ein Javascript-Interface. Dann brauchst du noch eine Javascript-Funktion die dir das Feld setzt und vom Javascript-Interface den Wert bekommt.

Wie du in JS per Xpath arbeitest erfährst du hier, du kannst natürlich auch per JS-DOM das Problem lösen und die Methode getElementsByName vom document Objekt verwenden. Ist in dem Fall wahrscheinlich einfacher.


----------



## FreshD (4. Mrz 2012)

so... eine frage hätt ich noch:
so zum test hab ich mal die maketoast function probiert, weiß aber nicht wie ich die im code aufrufe das ich den text verändern kann


```
getWebView().loadUrl("file:///android_asset/elcomp.html");
			getWebView().loadUrl("javascript:showAndroidToast('Hello World!')");
```
die funktion in der html

```
<html>
  <head>
	<script type="text/javascript">
    function showAndroidToast(toast) {
        Android.showToast(toast);
    }
	</script>
    <title></title>
  </head>
  <body">
  </body>
</html>
```

weißt du das zufällig?
lg freshd


----------



## schlingel (5. Mrz 2012)

Hm, so wie du es machst benötigst du gar kein Android-Interface, da du ja von außen ein JS aufrufen könntest.

Du schreibst dir deine JS-Methode (*ungetestet!*):


```
<html> 
  <head> 
    <script type="text/javascript"> 
    function changeText(name, value) { 
       var node = document.getElementsByName(name)[0];
       node.value = value;
    } 
    </script> 
    <title></title> 
  </head> 
  <body"> 
  </body> 
</html>
```

Und dann rufst du im Java-Code z.B. ne Methode auf wie: 


```
public void setValueOfWebFormElement(String name, String value) {
    getWebView().loadUrl(String.format("javascript:changeText('%s', '%s')", name, value);
}
```

Allerdings hat das den Nachteil, dass du nie sicher weißt ob die Seite bereits aufgebaut wurde oder nicht. Hier erklärt sich dann auch warum ich vom Android-Interface gesprochen habe. Ich würde es so machen:
- Ein Java-Methode schreiben die den Wert für ein bestimmtes Form-Element returniert.
- Eine JS-Methode schreiben, die deine JS-Interface Methode aufruft um die Werte für deine Form-Elemente zu holen und im Code zu setzen.
- Die JS-Methode in einem onload-Handler registrieren.

Damit hättest du gleich mehrere Dinge sichergestellt:
- Der JS-Code ist in sich geschlossen und man sieht im JS-Code was passiert ohne den JAVA-Code anschauen zu müssen. In deiner Version ist die Web-App ja vom Java-Code abhängig der irgendwann die JS-Methode aufruft, imho sollte das umgekehrt sein.
- Du kannst dir sicher sein, dass die Elemente du benötigst bereits geladen wurden.
- Eine sauberere Trennung zwischen App- und Web-Code. (Wobei solche Misch-Apps sowieso immer zu Monster degenerieren.)


----------



## FreshD (5. Mrz 2012)

schlingel hat gesagt.:


> Hm, so wie du es machst benötigst du gar kein Android-Interface, da du ja von außen ein JS aufrufen könntest.
> 
> Du schreibst dir deine JS-Methode (*ungetestet!*):
> 
> ...



Das einzige Problem an deiner Methode ist, das es keine eigene Website ist und ich die onload funktion so nicht verwenden kann.


----------

