Android
WebView
Szukaj…
Wprowadzenie
WebView to widok wyświetlający strony internetowe w Twojej aplikacji. W ten sposób możesz dodać własny adres URL.
Uwagi
Nie zapomnij dodać uprawnienia do pliku manifestu Androida
<uses-permission android:name="android.permission.INTERNET" />
Okna dialogowe alertów JavaScript w WebView - Jak sprawić, by działały
Domyślnie WebView nie implementuje okien dialogowych alertów JavaScript, tj. alert()
nic nie zrobi. Aby to zrobić, musisz najpierw włączyć JavaScript (oczywiście ..), a następnie ustawić WebChromeClient
do obsługi żądań okien dialogowych alertów ze strony:
webView.setWebChromeClient(new WebChromeClient() {
//Other methods for your WebChromeClient here, if needed..
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
return super.onJsAlert(view, url, message, result);
}
});
Tutaj zastępujemy onJsAlert
, a następnie wywołujemy super implementację, która daje nam standardowe okno dialogowe Androida. Możesz również samodzielnie użyć wiadomości i adresu URL, na przykład, jeśli chcesz utworzyć niestandardowe okno dialogowe lub je zalogować.
Komunikacja z Javascript do Java (Android)
Aktywność na Androidzie
package com.example.myapp;
import android.os.Bundle;
import android.app.Activity;
import android.webkit.WebView;
public class WebViewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webView = new WebView(this);
setContentView(webView);
/*
* Note the label Android, this is used in the Javascript side of things
* You can of course change this.
*/
webView.addJavascriptInterface(new JavascriptHandler(), "Android");
webView.loadUrl("http://example.com");
}
}
Java Javascript Handler
import android.webkit.JavascriptInterface;
public class JavascriptHandler {
/**
* Key point here is the annotation @JavascriptInterface
*
*/
@JavascriptInterface
public void jsCallback() {
// Do something
}
@JavascriptInterface
public void jsCallbackTwo(String dummyData) {
// Do something
}
}
Strona internetowa, wywołanie JavaScript
<script>
...
Android.jsCallback();
...
Android.jsCallback('hello test');
...
</script>
Dodatkowa wskazówka
Przekazując złożoną strukturę danych, możliwym rozwiązaniem jest użycie JSON.
Android.jsCallback('{ "fake-var" : "fake-value", "fake-array" : [0,1,2] }');
Po stronie Androida użyj ulubionego parsera JSON, tj .: JSONObject
Komunikacja z Java do Javascript
Podstawowy przykład
package com.example.myapp;
import android.os.Bundle;
import android.app.Activity;
import android.webkit.WebView;
public class WebViewActivity extends Activity {
private Webview webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
webView = new WebView(this);
webView.getSettings().setJavaScriptEnabled(true);
setContentView(webView);
webView.loadUrl("http://example.com");
/*
* Invoke Javascript function
*/
webView.loadUrl("javascript:testJsFunction('Hello World!')");
}
/**
* Invoking a Javascript function
*/
public void doSomething() {
this.webView.loadUrl("javascript:testAnotherFunction('Hello World Again!')");
}
}
Przykład otwartego dialera
Jeśli strona internetowa a zawiera numer telefonu, możesz nawiązać połączenie za pomocą dialera telefonu. Ten kod sprawdza adres URL rozpoczynający się od tel: następnie zrób zamiar otwarcia dialera i możesz nawiązać połączenie z klikniętym numerem telefonu:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("tel:")) {
Intent intent = new Intent(Intent.ACTION_DIAL,
Uri.parse(url));
startActivity(intent);
}else if(url.startsWith("http:") || url.startsWith("https:")) {
view.loadUrl(url);
}
return true;
}
Rozwiązywanie problemów z WebView poprzez drukowanie komunikatów konsoli lub zdalne debugowanie
Drukowanie komunikatów konsoli Webview do logcat
Aby obsługiwać komunikaty console
ze strony internetowej, możesz zastąpić onConsoleMessage
w WebChromeClient
:
final class ChromeClient extends WebChromeClient {
@Override
public boolean onConsoleMessage(ConsoleMessage msg) {
Log.d(
"WebView",
String.format("%s %s:%d", msg.message(), msg.lineNumber(), msg.sourceId())
);
return true;
}
}
I ustaw go w swojej aktywności lub fragmencie:
webView.setWebChromeClient(new ChromeClient());
Ta przykładowa strona:
<html>
<head>
<script type="text/javascript">
console.log('test message');
</script>
</head>
<body>
</body>
</html>
zapisze log „test test” do logcat:
WebView: wiadomość testowa sample.html: 4
console.info()
, console.warn()
i console.error()
są również obsługiwane przez chrome-client.
Zdalne debugowanie urządzeń z Androidem za pomocą Chrome
Możesz zdalnie debugować aplikację opartą na webview z komputera stacjonarnego Chrome.
Włącz debugowanie USB na urządzeniu z Androidem
Na urządzeniu z Androidem otwórz Ustawienia, znajdź sekcję Opcje programisty i włącz debugowanie USB.
Podłącz i odkryj swoje urządzenie z Androidem
Otwórz stronę w chrome następująca strona: chrome: // inspect / # devices
W oknie dialogowym Sprawdź urządzenia wybierz swoje urządzenie i naciśnij przycisk sprawdź . Na Twoim komputerze programistycznym otwiera się nowa instancja DevTools Chrome.
Bardziej szczegółowe wytyczne i opis DevTools można znaleźć na developers.google.com
Otwórz plik lokalny / Utwórz zawartość dynamiczną w widoku sieci Web
Layout.xml
<WebView
android:id="@+id/WebViewToDisplay"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:fadeScrollbars="false" />
Załaduj dane do WebViewToDisplay
WebView webViewDisplay;
StringBuffer LoadWEb1;
webViewDisplay = (WebView) findViewById(R.id.WebViewToDisplay);
LoadWEb1 = new StringBuffer();
LoadWEb1.append("<html><body><h1>My First Heading</h1><p>My first paragraph.</p>");
//Sample code to read parameters at run time
String strName = "Test Paragraph";
LoadWEb1.append("<br/><p>"+strName+"</p>");
String result = LoadWEb1.append("</body></html>").toString();
WebSettings webSettings = webViewDisplay.getSettings();
webSettings.setJavaScriptEnabled(true);
webViewDisplay.getSettings().setBuiltInZoomControls(true);
if (android.os.Build.VERSION.SDK_INT >= 11){
webViewDisplay.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
webViewDisplay.getSettings().setDisplayZoomControls(false);
}
webViewDisplay.loadDataWithBaseURL(null, result, "text/html", "utf-8",
null);
//To load local file directly from assets folder use below code
//webViewDisplay.loadUrl("file:///android_asset/aboutapp.html");