WebView mit Seite aus dem Netz aber mit eigener CSS

  • 19 Antworten
  • Neuester Beitrag
Diskutiere WebView mit Seite aus dem Netz aber mit eigener CSS im Android App Entwicklung im Bereich Betriebssysteme & Apps.
kleinerkathe

kleinerkathe

Experte
Hey,

kleines Problem:

Ich hab eine URL/Seite aus dem Netz, die lade ich jetzt per loadUrl.
Gibt es irgendeinen Befehl, dass ich eine zusätzliche CSS einbinden oder gar die vorhandene mit einer lokalen CSS überschreiben kann?


Kurz gesagt: Internetseite aus dem Netz + lokaler *.css, wie?

Den umständlichen Weg über loadDataWithBaseUrl() könnte ich gehen, aber ich will eigentlich nur(!) die CSS ersetzen und nicht auch alle images und sonstigen Medien :/

Zugriff auf die Webseite um extra CSS-Angaben oder sonst etwas hinzuzufügen hab ich nicht :/ Die Webseite "parsen" und den <style>-Tag würde ich eigentlich verhindern wollen, da mir das nicht als die einfachste Lösung erscheint ^^

//EDIT: Eine "schnelle" unschöne Lösung hätte ich schon mal: http://lexandera.com/2009/01/injecting-javascript-into-a-webview/
Aber da wird die Seite zuerst gerendert und angezeigt und *schwupp* danach die Sachen verändert :/
 
Zuletzt bearbeitet:
DieGoldeneMitte

DieGoldeneMitte

Experte
So aus der Hüfte geschossen: In WebViewClient.shouldInterceptRequest() müsste man doch das Laden des CSS abfangen können.
 
kleinerkathe

kleinerkathe

Experte
Scheint genau das richtige zu sein :)
Aber :( "Since: API Level 11"
 
DieGoldeneMitte

DieGoldeneMitte

Experte
Huch, wie kommt die Honeycomb Apidoc auf meinen Rechner? ;-)
 
A

androdio

Neues Mitglied
hallo zusammen

und wie ginge das genau mit loadDataWithBaseUrl(). wie kann ich da das css ersetzen. vielen dank!
 
M

MichaelS

Erfahrenes Mitglied
Es gibt mehrere Möglichkeiten:

1. Du rufst die HTML Seite manuell ab und setzt ein style tag mit deinem css in den html code oder du ersetzt einfach eine css datei mit einer die online ist oder so.
2. Du fügst wenn die Seite geladen ist dein css block in die Page (Damit kann es passieren, dass zuerst der alte stand sichtbar ist)
3. Um das Laden nicht manuell zu machen müsstest du den CacheManager austricksen und die CacheDB faken mit deinem Inhalt für Xy.css die die Website anfordert. (Habe ich schon gemacht klappt wunderbar)

Gruß
Michael
 
A

androdio

Neues Mitglied
Hallo Michael

Danke für deine Antworten.

1. Geht nicht. Habe keinen Zugriff auf die aspx datei.
2. unschöne lösung.
3. klingt nicht schlecht. nur habe ich gelesen das der cache access demnächst nicht mehr möglich sein wird.

Dann muss ich wohl bis ice cream sandwich warten, shouldInterceptRequest() anwenden .kann ich da daten aus dem string löschen und einen neuen css tag einfügen?

Gruss
Stefan
 
M

MichaelS

Erfahrenes Mitglied
1. geht wohl du kannst doch statt die url im webbrowser zu laden einfach nen eigenen request machen und die bytes lesen und dann den content direkt in eine webview übergeben.

ansonsten die methode von ICS verwenden da kannst du jeden request abfangen und verändern ;)
 
A

androdio

Neues Mitglied
Hallo Michael

Wie geht denn das mit request, ohne die seite zu laden. Hast da ein sample? Vielen Dank.

Gruss
Stefan
 
A

androdio

Neues Mitglied
Danke, habe das jetzt soweit hingekriegt. Nur wird das natürlich umständlich mit den Bilder und den <form> daten.

Wie würde das mit dem shouldinterceptrequest genau funktionieren?

Du bist mir wirklich eine grosse Hilfe.

Gruss vom Android beginner!
Stefan
 
M

MichaelS

Erfahrenes Mitglied
Die Methode ab API 11 is ziemlich genial :) Da bekommst du jeden Request und kannst selber entscheiden was du ihm zurück lieferst. Entweder ganz normal weiter arbeiten lassen oder wenn er z.B. "app.css" anfordert, lieferst du ihm einfach deine eigene aus. Denkbar wäre auch die original zu downloaden sie zu modifizieren und diese dann auszuliefern :)

Wäre deutlich dynamischer und hübscher ^^ leider erst ab API11
 
A

androdio

Neues Mitglied
Hättest du da einen example für einen request. Danke!
 
M

MichaelS

Erfahrenes Mitglied
Habe ich dir bereits geschickt wie man ein HTTP Request macht :)
 
A

androdio

Neues Mitglied
Ja,danke.funktioniert auch bei mir.ausser die links müssen angepasst werden, damit ich die Bilder seue. Meine Frage ist nun, wie der Request in Zusammenhang mit der shouldinterceptrequest Methode funzt. Gebe ich dem webviewclient damit bekannt,dass ich einen request gemacht habe?
 
M

MichaelS

Erfahrenes Mitglied
Du musst natürlich beim setzen des HTML Codes der Webview sagen welchen basepfad sie hat sprich Parallels Confixx wäre der basepfad ansonsten können relative bilder nicht dargestellt werden. wenn du den weglässt, probiert er bilder zu laden wie "/images/muh.png" statt http://muh.de/images/muh.png
 
A

androdio

Neues Mitglied
Vor wenigen Tagen funktionierte diese Funktion noch: jetzt stürzt mir die app dauernd ab deswegen.

private String getP() {
String str = "***";

try
{
HttpClient hc = new DefaultHttpClient();
HttpPost post = new HttpPost("http://www.yahoo.com");

HttpResponse rp = hc.execute(post);

if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
{
str = EntityUtils.toString(rp.getEntity());
}
}catch(IOException e){
e.printStackTrace();
}

return str;
}

hast du eine idee? Danke
 
N

nijoX

Neues Mitglied
Hallo androido,
wie wäre es wenn du noch nen logcat Auszug sendest? damit kann dir besser geholfen werden :)

MfG nijoX
 
A

androdio

Neues Mitglied
Habe einen androi.os......networkonmainthreadexception wie kann ich am ohne fehlermeldung einen netzwerk request im main thread aufrufen. handler?
 
A

androdio

Neues Mitglied
ich habs mehr oder weniger hingekriegt mit einem handler. wie macht man das genau mit dem shouldinterceptrequest(view, url)? kann mir da jemand ein beispiel aufzeigen. danke vielmals!