Поиск…


Вступление

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");


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow