Android
WebView
Поиск…
Вступление
WebView - это представление, отображающее веб-страницы внутри вашего приложения. При этом вы можете добавить свой собственный URL.
замечания
Не забудьте добавить разрешение в файл манифеста Android
<uses-permission android:name="android.permission.INTERNET" />
Диалоги оповещений JavaScript в WebView - как заставить их работать
По умолчанию WebView не реализует диалоговые окна предупреждения JavaScript, то есть. alert()
ничего не сделает. Чтобы вам было нужно сначала включить JavaScript (очевидно ..), а затем установить WebChromeClient
для обработки запросов на диалоговые окна предупреждений со страницы:
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);
}
});
Здесь мы переопределяем onJsAlert
, а затем onJsAlert
к супер-реализации, которая дает нам стандартный диалог Android. Вы также можете использовать сообщение и URL-адрес самостоятельно, например, если вы хотите создать пользовательское диалоговое окно стиля или если вы хотите их зарегистрировать.
Общение с Javascript на Java (Android)
Активность Android
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
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
}
}
Веб-страница, вызов Javascript
<script>
...
Android.jsCallback();
...
Android.jsCallback('hello test');
...
</script>
Дополнительный совет
При переходе в сложную структуру данных возможным решением является использование JSON.
Android.jsCallback('{ "fake-var" : "fake-value", "fake-array" : [0,1,2] }');
На стороне Android используйте свой любимый парсер JSON, то есть: JSONObject
Общение с Java на Javascript
Основной пример
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!')");
}
}
Пример открытого набора
Если веб-страница a содержит номер телефона, вы можете позвонить, используя дозвон вашего телефона. Этот код проверяет URL-адрес, который начинается с tel: затем сделайте намерение открыть дозвонщик, и вы можете позвонить по нажатому номеру телефона:
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;
}
Устранение неполадок WebView путем печати сообщений консоли или удаленной отладки
Печать сообщений консоли webview для logcat
Чтобы обрабатывать console
сообщения с веб-страницы, вы можете переопределить onConsoleMessage
в 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;
}
}
И установите его в своей деятельности или фрагменте:
webView.setWebChromeClient(new ChromeClient());
Итак, эта примерная страница:
<html>
<head>
<script type="text/javascript">
console.log('test message');
</script>
</head>
<body>
</body>
</html>
будет записывать журнал «тестовое сообщение» на logcat:
WebView: тестовое сообщение sample.html: 4
console.info()
, console.warn()
и console.error()
также поддерживаются хром-клиентом.
Удаленное отладочное устройство Android с Chrome
Ваш удаленный отлаживающий веб-приложение на основе вашего браузера Chrome.
Включить отладку USB на устройстве Android.
На устройстве Android откройте «Настройки», найдите раздел «Параметры разработчика» и включите USB-отладку.
Подключайтесь и обнаруживайте Android-устройство
Открыть страницу в хроме на следующей странице: chrome: // проверка / # устройств
В диалоговом окне «Inspect Devices» выберите ваше устройство и нажмите « проверить» . На вашем компьютере разработки открывается новый экземпляр DevTools от Chrome.
Более подробное руководство и описание DevTools можно найти на developers.google.com.
Открыть локальный файл / создать динамический контент в Webview
layout.xml
<WebView
android:id="@+id/WebViewToDisplay"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:fadeScrollbars="false" />
Загрузка данных в 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");