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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow