Dies ist ein android WebView
Tutorial und Beispiele. Eine WebView
ist eine android SDK-Ansicht, die in der Lage ist, Webseiten darzustellen.
Was ist eine WebView
?
Ein
WebView
ist, wie wir bereits gesagt haben, eine Ansicht, die Webseiten anzeigt.
Sie wird durch die Klasse WebView
repräsentiert. Diese Klasse ist viel mächtiger, als Sie vielleicht denken. Dennoch ist sie sehr einfach und geradlinig zu verwenden und bietet Ihnen Abstraktionen, auf denen Sie aufbauen können.
Diese Klasse ist die Grundlage, auf der Sie Ihren eigenen Webbrowser erstellen oder einfach einige Online-Inhalte innerhalb Ihrer Aktivität anzeigen können. WebView" nutzt die Rendering-Engine WebKit zur Darstellung von Webseiten und enthält Methoden, um:
- vorwärts und rückwärts durch einen Verlauf zu navigieren
- ein- und auszoomen.
- eine Textsuche durchführen und mehr.
WebView ist sehr leistungsfähig, da es Ihnen eine Möglichkeit bietet, Anwendungen in Sprachen wie Javascript und HTML zu schreiben. Es gibt so viele Frameworks, die diese Fähigkeit nutzen und es Ihnen ermöglichen, Ihre Anwendung in HTML5-Technologien zu schreiben. Sie können sogar Ihre Website, z. B. eine WordPress-Website, in eine Android-App verwandeln.
WebView
API Definition
WebView" ist eine konkrete Klasse, die sich im Paket "Android.Webkit" befindet. Sie leitet sich von der Klasse android.widget.AbsoluteLayout
ab und implementiert mehrere Schnittstellen wie unten gezeigt:
public class WebView extends AbsoluteLayout implements ViewTreeObserver.OnGlobalFocusChangeListener, ViewGroup.OnHierarchyChangeListener
Hier ist die Vererbungshierarchie der Klasse:
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.widget.AbsoluteLayout
↳ android.webkit.WebView
Warum Webview?
WebView ist wahrscheinlich eine der praktischsten, einfach zu bedienenden und dennoch wenig genutzten Klassen in Android. Das liegt daran, dass sie es Ihnen im Grunde ermöglicht, eine Android-App mit HTML, CSS und Javascript zu erstellen. Ich würde es verstehen, wenn sie nicht so viel genutzt würde, wenn sie kein Javascript ausführen oder CSS rendern könnte. Aber all das kann es.
Damit verfügt es über leistungsstarke Funktionen, denn HTML, CSS und Javascript sind einfach zu verwendende, beliebte Technologien, die die Benutzeroberflächen fast aller Webanwendungen oder Websites, die Sie jemals besucht haben, antreiben. Außerdem gibt es Hunderte von Frameworks/Bibliotheken für diese Technologien, die leistungsstarke Widgets und Abstraktionen bereitstellen. Dazu gehören jQuery, Vue.js, Angular, React.js, Bootstrap, materializecss, UIKit usw.
Sie können ganz einfach eine einfache clientseitige Webanwendung erstellen, die mit serverseitigen Technologien wie Node.js und PHP interagieren kann, und diese dann in Ihrem Assets
-Ordner ablegen. Verwenden Sie dann WebView
, um sie zu laden. Sie müssen jedoch sicherstellen, dass Javascript aktiviert ist. Ich weiß, dass dies nicht so leistungsfähig ist wie eine vollständige Java-Anwendung, die in Java, Kotlin oder C# geschrieben wurde, aber für Anfänger würden Sie schnell Ihre erste Anwendung erstellen, die Sie Freunden zeigen können, während Sie Ihre Ausbildung fortsetzen.
Verwendung von WebView
In den meisten Fällen werden Sie Online-Inhalte in Ihrem Webview darstellen wollen. Damit deine Aktivität auf das Internet zugreifen und Webseiten in einer WebView
laden kann, musst du die INTERNET
-Berechtigungen zu deiner Android Manifest
-Datei hinzufügen:
<uses-permission android_name="android.permission.INTERNET" />
Dann fügen Sie in Ihrem Layout ein <WebView>
hinzu, oder setzen Sie das gesamte Activity
-Fenster als WebView
während onCreate():
WebView webview = new WebView(this);
setContentView(webview);
Sobald du das getan hast, kannst du deine Webseite über die Methode loadUrl()
laden:
// Simplest usage: note that an exception will NOT be thrown
// if there is an error loading this page (see below).
webview.loadUrl("https://camposha.info/");
Die Methode loadurl()
lädt unsere Webseite von der von uns angegebenen Url. Dies ist die am häufigsten verwendete Methode.
Sie können auch von einem HTML string
laden:
String summary = "<html><body>You scored <b>192</b> points.</body></html>";
webview.loadData(summary, "text/html", null);
// ... although note that there are restrictions on what this HTML can do.
// See the JavaDocs for loadData() and loadDataWithBaseURL() for more info.
Das bedeutet, dass Sie Ihren HTML-Code in eine Zeichenkette schreiben. Dann laden Sie ihn über die Methode loadData()
. Dies eignet sich zum Laden von Webseiten mit einfacher DOM(Document Object Model) Struktur.
Schnelle WebView
Beispiele und HowTo's
Schauen wir uns schnelle HowTos für unsere Webview-Klasse an. Später werden wir dann sehen, wie man eine vollständige Anwendung schreibt.
1. Häufig verwendete WebView
-Einstellungen
Hier sind einige häufig benutzte WebView
-Einstellungen. Lassen Sie uns diese in einer einfachen statischen Methode kapseln, die wir dann leicht wiederverwenden können.
// Commonly used WebViewSetting
public static void initWebSetting(WebView webView) {
WebSettings setting = webView.getSettings();
setting.setJavaScriptEnabled(true);
setting.setAllowFileAccess(true);
setting.setAllowFileAccessFromFileURLs(true);
setting.setAllowUniversalAccessFromFileURLs(true);
setting.setAppCacheEnabled(true);
setting.setDatabaseEnabled(true);
setting.setDomStorageEnabled(true);
setting.setCacheMode(WebSettings.LOAD_DEFAULT);
setting.setAppCachePath(webView.getContext().getCacheDir().getAbsolutePath());
setting.setUseWideViewPort(true);
setting.setLoadWithOverviewMode(true);
setting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
setting.setAllowFileAccessFromFileURLs(true);
}
}
Diese Methode nimmt ein WebView
Objekt. Wir erhalten zuerst die Webview-Einstellungen über die Methode getSettings
der Klasse WebView
. Dann aktivieren wir Javascript mit der Methode setJavaScriptEnabled()
. Die meisten dieser Einstellungsmethoden nehmen einen booleschen Wert an, um verschiedene Einstellungen entweder zu aktivieren oder zu deaktivieren.
2. Wie man eine benutzerdefinierte WebView
erstellt
Wir wollen eine benutzerdefinierte Webansicht erstellen, die in einer NestedScrollView verwendet werden kann.
import android.content.Context;
import android.support.v4.view.MotionEventCompat;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.webkit.WebView;
public class MyWebView extends WebView {
public MyWebView(Context context) {
super(context);
}
public MyWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//Check pointer index to avoid -1 (error)
if (MotionEventCompat.findPointerIndex(event, 0) == -1) {
return super.onTouchEvent(event);
}
if (event.getPointerCount() >= 1) {
requestDisallowInterceptTouchEvent(true);
} else {
requestDisallowInterceptTouchEvent(false);
}
return super.onTouchEvent(event);
}
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
requestDisallowInterceptTouchEvent(true);
}
}
1. Android WebView
- Laden aus URL, Strings und Asset-Ordner
Android
WebView
- Laden aus URL, Strings und Asset-Ordner
WebView ist eigentlich eine der Klassen, die es in Android von Anfang an gegeben hat.
Sie wurde in der API-Stufe 1 hinzugefügt und befindet sich im android.webkit-Paket. Es wird verwendet, um Webinhalte direkt innerhalb der "Aktivität" anzuzeigen. Das macht sie sehr leistungsfähig und kann verwendet werden, um sogar einen einfachen Browser zu bauen, der funktioniert. Es ist immer noch eine Ansicht, so dass wir sie einfach aus der Palette in unser Layout ziehen können. Er rendert Webseiten mit der Webkit-Rendering-Engine. In diesem Beispiel verwenden wir einen Webview, um Webinhalte von :
- URL online.
- Lokaler Ordner
Assets
. - Zeichenkette im Java-Code.
Um von einer URL zu laden, muss die android internet permission in der androidmanifest.xml eingetragen werden. Weitere Einzelheiten über WebView
finden Sie hier.
Bildschirmfoto
- Hier ist der Screenshot des Projekts.
Häufige Fragen, die dieses Beispiel untersucht
- Was ist
WebView
? - Wie lade ich eine Website von einer URL in Webview?
- Wie lade ich html aus dem Ordner
Assets
in Webview. - Wie lädt man html
string
in webview. - Wie benutzt man Webview in Android
Activity
.
Verwendete Werkzeuge
Dieses Beispiel wurde mit den folgenden Tools geschrieben:
- Windows 8
- AndroidStudio IDE
- Genymotion-Emulator
- Sprache: Java
In diesem Projekt wurde keine Bibliothek eines Drittanbieters verwendet.
Lassen Sie uns direkt zum Quellcode springen.
AndroidManifest.xml
- Android Manifest"-Datei.
- Fügen Sie die Internet-Berechtigung hinzu, da wir eine Webseite auch von url abrufen werden.
<?xml version="1.0" encoding="utf-8"?>
<manifest
package="com.tutorials.hp.webviewer">
<uses-permission android_name="android.permission.INTERNET"/>
...
</manifest>
Build.Gradle
- Normalerweise gibt es in Android-Projekten zwei
build.gradle
-Dateien. Eine ist die App-Ebenebuild.gradle
, die andere ist die Projektebenebuild.gradle
. Die App-Ebene gehört in den App-Ordner und ist der Ort, an dem wir normalerweise unsere Abhängigkeiten hinzufügen und die Kompilier- und Ziel-Sdks angeben. - Fügen Sie auch Abhängigkeiten für AppCompat und Design Support Bibliotheken hinzu.
- Unsere
MainActivity
soll von AppCompatActivity abgeleitet werden, während wir auch den Floating Action Button aus den Design Support Bibliotheken verwenden sollen.
dependencies {
implementation 'com.android.support:appcompat-v7:26.+'
implementation 'com.android.support.constraint:constraint-layout:1.0.0-alpha7'
implementation 'com.android.support:design:26.+'
testImplementation 'junit:junit:4.12'
}
MainActivity
.java
- Launcher
Activity
. - ActivityMain.xml wird als Inhaltsansicht für diese
Activity
aufgeblasen. - Wir initialisieren Ansichten und Widgets innerhalb dieser
Activity
. - Wir schalten durch die Menüpunkte in unserer Symbolleiste und wählen aus, ob wir von url, assets oder
string
laden wollen.
package com.tutorials.hp.webviewer;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
webView= (WebView) findViewById(R.id.myWebview);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
/*
LOAD WEBSITE
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.urlID) {
//LOAD FROM URL
webView.loadUrl("https://camposha.info");
return true;
}else if (id == R.id.assetsID) {
//LOAD FROM ASSETS
webView.loadUrl("file:///android_asset/Campo.html");
return true;
}else if (id == R.id.stringID) {
//LOAD FROM STRING
String html="<html><title></title><body>" +
"<h1><u>Programming Languages</u></h1>" +
"Below are some languages check them out: " +
"<ol>" +
"<li>Java</li><li>C#</li><li>C++</li><li>Python</li><li>PHP</li><li>Perl</li>" +
"</ol>" +
"</body></html>";
webView.loadData(html,"text/html","UTF-8");
return true;
}
return super.onOptionsItemSelected(item);
}
}
ActivityMain.xml
- Template-Layout.
- Enthält unsere
ContentMain.xml
. - Definiert auch das
appbarlayout
,toolbar
sowie denfloatingaction buttton
.
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
tools_context="com.tutorials.hp.webviewer.MainActivity">
<android.support.design.widget.AppBarLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android_id="@+id/toolbar"
android_layout_width="match_parent"
android_layout_height="?attr/actionBarSize"
android_background="?attr/colorPrimary"
app_popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
<android.support.design.widget.FloatingActionButton
android_id="@+id/fab"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_gravity="bottom|end"
android_layout_margin="@dimen/fab_margin"
app_srcCompat="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
ContentMain.xml
- Content Layout.
- Definiert die Ansichten und Widgets, die innerhalb der
MainActivity
angezeigt werden sollen. - In diesem Fall ist es eine einfache Webansicht.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
app_layout_behavior="@string/appbar_scrolling_view_behavior"
tools_context="com.tutorials.hp.webviewer.MainActivity"
tools_showIn="@layout/activity_main">
<WebView
android_id="@+id/myWebview"
android_layout_width="match_parent"
android_layout_height="match_parent"
android_layout_centerHorizontal="true"
/>
</android.support.constraint.ConstraintLayout>
menu_main.xml
- Wir werden durch die Menüpunkte in unserer Symbolleiste wechseln.
- Definieren wir dies in
menu_main.xml
im Verzeichnis des Menüs.
<menu
tools_context="com.tutorials.hp.webviewer.MainActivity">
<item
android_id="@+id/action_settings"
android_orderInCategory="100"
android_title="@string/action_settings"
app_showAsAction="never" />
<item
android_id="@+id/urlID"
android_title="URL"
app_showAsAction="never" />
<item
android_id="@+id/assetsID"
android_title="Assets"
app_showAsAction="never" />
<item
android_id="@+id/stringID"
android_title="String"
app_showAsAction="never" />
</menu>
Download.
- Laden Sie das folgende Projekt herunter:
No. | Ort | Link |
---|---|---|
1. | GitHub | Direkter Download |
2. | GitHub | Durchsuchen |
Schlussfolgerung.
Wir haben ein einfaches Android-Webview-Beispiel gesehen. Wie man Webseiten aus dem Internet per Url, aus dem Ordner "Assets" und aus "String"-Daten lädt.
Wie man CSS in eine WebView
einfügt
Vielleicht möchten Sie eine Seite, die Ihnen nicht gehört, mit CSS manipulieren. Nehmen wir an, dass eine Webseite geladen wird und Sie dann Ihr eigenes Styling in CSS anwenden.
Dies ist in android webview möglich. Hier sind die Schritte:
Schritt 1: Base64 importieren
Fügen Sie den folgenden Import hinzu:
import android.util.Base64
Schritt 2: Erstellen Sie eine Funktion zum Einfügen von css
Diese Funktion wird css über Javascript einfügen:
private fun injectCSS() {
try {
val inputStream = assets.open("style.css")
val buffer = ByteArray(inputStream.available())
inputStream.read(buffer)
inputStream.close()
val encoded = Base64.encodeToString(buffer , Base64.NO_WRAP)
webframe.loadUrl(
"javascript:(function() {" +
"var parent = document.getElementsByTagName('head').item(0);" +
"var style = document.createElement('style');" +
"style.type = 'text/css';" +
// Tell the browser to BASE64-decode the string into your script !!!
"style.innerHTML = window.atob('" + encoded + "');" +
"parent.appendChild(style)" +
"})()"
)
} catch (e: Exception) {
e.printStackTrace()
}
}
Schritt 3: Überschreiben Sie onPageFinished
Der nächste Schritt ist das Überschreiben des Ereignisses "onPageFinished", das aufgerufen wird, sobald die Webansicht den Inhalt geladen hat.
override fun onPageFinished(view: WebView?, url: String?) {
injectCSS()
}
That's it.