1page.title=Building Web Apps in WebView 2@jd:body 3 4<div id="qv-wrapper"> 5<div id="qv"> 6<h2>Quickview</h2> 7<ul> 8 <li>Use {@link android.webkit.WebView} to display web pages in your Android application 9layout</li> 10 <li>You can create interfaces from your JavaScript to your client-side Android code</li> 11</ul> 12 13<h2>In this document</h2> 14<ol> 15 <li><a href="#AddingWebView">Adding a WebView to Your Application</a></li> 16 <li><a href="#UsingJavaScript">Using JavaScript in WebView</a> 17 <ol> 18 <li><a href="#EnablingJavaScript">Enabling JavaScript</a></li> 19 <li><a href="#BindingJavaScript">Binding JavaScript code to Android code</a></li> 20 </ol> 21 </li> 22 <li><a href="#HandlingNavigation">Handling Page Navigation</a> 23 <ol> 24 <li><a href="#NavigatingHistory">Navigating web page history</a></li> 25 </ol> 26 </li> 27</ol> 28 29<h2>Key classes</h2> 30<ol> 31 <li>{@link android.webkit.WebView}</li> 32 <li>{@link android.webkit.WebSettings}</li> 33 <li>{@link android.webkit.WebViewClient}</li> 34</ol> 35 36<h2>Related tutorials</h2> 37<ol> 38 <li><a href="{@docRoot}resources/tutorials/views/hello-webview.html">Web View</a></li> 39</ol> 40 41</div> 42</div> 43 44<p>If you want to deliver a web application (or just a web page) as a part of a client application, 45you can do it using {@link android.webkit.WebView}. The {@link android.webkit.WebView} class is an 46extension of Android's {@link android.view.View} class that allows you to display web pages as a 47part of your activity layout. It does <em>not</em> include any features of a fully developed web 48browser, such as navigation controls or an address bar. All that {@link android.webkit.WebView} 49does, by default, is show a web page.</p> 50 51<p>A common scenario in which using {@link android.webkit.WebView} is helpful is when you want to 52provide information in your application that you might need to update, such as an end-user agreement 53or a user guide. Within your Android application, you can create an {@link android.app.Activity} 54that contains a {@link android.webkit.WebView}, then use that to display your document that's 55hosted online.</p> 56 57<p>Another scenario in which {@link android.webkit.WebView} can help is if your application provides 58data to the user that 59always requires an Internet connection to retrieve data, such as email. In this case, you might 60find that it's easier to build a {@link android.webkit.WebView} in your Android application that 61shows a web page with all 62the user data, rather than performing a network request, then parsing the data and rendering it in 63an Android layout. Instead, you can design a web page that's tailored for Android devices 64and then implement a {@link android.webkit.WebView} in your Android application that loads the web 65page.</p> 66 67<p>This document shows you how to get started with {@link android.webkit.WebView} and how to do some 68additional things, such as handle page navigation and bind JavaScript from your web page to 69client-side code in your Android application.</p> 70 71 72 73<h2 id="AddingWebView">Adding a WebView to Your Application</h2> 74 75<p>To add a {@link android.webkit.WebView} to your Application, simply include the {@code 76<WebView>} element in your activity layout. For example, here's a layout file in which the 77{@link android.webkit.WebView} fills the screen:</p> 78 79<pre> 80<?xml version="1.0" encoding="utf-8"?> 81<WebView xmlns:android="http://schemas.android.com/apk/res/android" 82 android:id="@+id/webview" 83 android:layout_width="fill_parent" 84 android:layout_height="fill_parent" 85/> 86</pre> 87 88<p>To load a web page in the {@link android.webkit.WebView}, use {@link 89android.webkit.WebView#loadUrl(String) loadUrl()}. For example:</p> 90 91<pre> 92WebView myWebView = (WebView) findViewById(R.id.webview); 93myWebView.loadUrl("http://www.example.com"); 94</pre> 95 96<p>Before this will work, however, your application must have access to the Internet. To get 97Internet access, request the {@link android.Manifest.permission#INTERNET} permission in your 98manifest file. For example:</p> 99 100<pre> 101<manifest ... > 102 <uses-permission android:name="android.permission.INTERNET" /> 103 ... 104</manifest> 105</pre> 106 107<p>That's all you need for a basic {@link android.webkit.WebView} that displays a web page.</p> 108 109 110 111 112<h2 id="UsingJavaScript">Using JavaScript in WebView</h2> 113 114<p>If the web page you plan to load in your {@link android.webkit.WebView} use JavaScript, you 115must enable JavaScript for your {@link android.webkit.WebView}. Once JavaScript is enabled, you can 116also create interfaces between your application code and your JavaScript code.</p> 117 118 119<h3 id="EnablingJavaScript">Enabling JavaScript</h3> 120 121<p>JavaScript is disabled in a {@link android.webkit.WebView} by default. You can enable it 122through the {@link 123android.webkit.WebSettings} attached to your {@link android.webkit.WebView}. You can retrieve {@link 124android.webkit.WebSettings} with {@link android.webkit.WebView#getSettings()}, then enable 125JavaScript with {@link android.webkit.WebSettings#setJavaScriptEnabled(boolean) 126setJavaScriptEnabled()}.</p> 127 128<p>For example:</p> 129 130<pre> 131WebView myWebView = (WebView) findViewById(R.id.webview); 132WebSettings webSettings = myWebView.getSettings(); 133webSettings.setJavaScriptEnabled(true); 134</pre> 135 136<p>{@link android.webkit.WebSettings} provides access to a variety of other settings that you might 137find useful. For example, if you're developing a web application 138that's designed specifically for the {@link android.webkit.WebView} in your Android application, 139then you can define a 140custom user agent string with {@link android.webkit.WebSettings#setUserAgentString(String) 141setUserAgentString()}, then query the custom user agent in your web page to verify that the 142client requesting your web page is actually your Android application.</p> 143 144from your Android SDK {@code tools/} directory 145<h3 id="BindingJavaScript">Binding JavaScript code to Android code</h3> 146 147<p>When developing a web application that's designed specifically for the {@link 148android.webkit.WebView} in your Android 149application, you can create interfaces between your JavaScript code and client-side Android code. 150For example, your JavaScript code can call a method in your Android code to display a {@link 151android.app.Dialog}, instead of using JavaScript's {@code alert()} function.</p> 152 153<p>To bind a new interface between your JavaScript and Android code, call {@link 154android.webkit.WebView#addJavascriptInterface(Object,String) addJavascriptInterface()}, passing it 155a class instance to bind to your JavaScript and an interface name that your JavaScript can call to 156access the class.</p> 157 158<p>For example, you can include the following class in your Android application:</p> 159 160<pre> 161public class JavaScriptInterface { 162 Context mContext; 163 164 /** Instantiate the interface and set the context */ 165 JavaScriptInterface(Context c) { 166 mContext = c; 167 } 168 169 /** Show a toast from the web page */ 170 public void showToast(String toast) { 171 Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); 172 } 173} 174</pre> 175 176<p>In this example, the {@code JavaScriptInterface} class allows the web page to create a {@link 177android.widget.Toast} message, using the {@code showToast()} method.</p> 178 179<p>You can bind this class to the JavaScript that runs in your {@link android.webkit.WebView} with 180{@link android.webkit.WebView#addJavascriptInterface(Object,String) addJavascriptInterface()} and 181name the interface {@code Android}. For example:</p> 182 183<pre> 184WebView webView = (WebView) findViewById(R.id.webview); 185webView.addJavascriptInterface(new JavaScriptInterface(this), "Android"); 186</pre> 187 188<p>This creates an interface called {@code Android} for JavaScript running in the {@link 189android.webkit.WebView}. At this point, your web application has access to the {@code 190JavaScriptInterface} class. For example, here's some HTML and JavaScript that creates a toast 191message using the new interface when the user clicks a button:</p> 192 193<pre> 194<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> 195 196<script type="text/javascript"> 197 function showAndroidToast(toast) { 198 Android.showToast(toast); 199 } 200</script> 201</pre> 202 203<p>There's no need to initialize the {@code Android} interface from JavaScript. The {@link 204android.webkit.WebView} automatically makes it 205available to your web page. So, at the click of the button, the {@code showAndroidToast()} 206function uses the {@code Android} interface to call the {@code JavaScriptInterface.showToast()} 207method.</p> 208 209<p class="note"><strong>Note:</strong> The object that is bound to your JavaScript runs in 210another thread and not in the thread in which it was constructed.</p> 211 212<p class="caution"><strong>Caution:</strong> Using {@link 213android.webkit.WebView#addJavascriptInterface(Object,String) addJavascriptInterface()} allows 214JavaScript to control your Android application. This can be a very useful feature or a dangerous 215security issue. When the HTML in the {@link android.webkit.WebView} is untrustworthy (for example, 216part or all of the HTML 217is provided by an unknown person or process), then an attacker can include HTML that executes 218your client-side code and possibly any code of the attacker's choosing. As such, you should not use 219{@link android.webkit.WebView#addJavascriptInterface(Object,String) addJavascriptInterface()} unless 220you wrote all of the HTML and JavaScript that appears in your {@link android.webkit.WebView}. You 221should also not allow the user to 222navigate to other web pages that are not your own, within your {@link android.webkit.WebView} 223(instead, allow the user's 224default browser application to open foreign links—by default, the user's web browser 225opens all URL links, so be careful only if you handle page navigation as described in the 226following section).</p> 227 228 229 230 231<h2 id="HandlingNavigation">Handling Page Navigation</h2> 232 233<p>When the user clicks a link from a web page in your {@link android.webkit.WebView}, the default 234behavior is 235for Android to launch an application that handles URLs. Usually, the default web browser opens and 236loads the destination URL. However, you can override this behavior for your {@link 237android.webkit.WebView}, 238so links open within your {@link android.webkit.WebView}. You can then allow the user to navigate 239backward and forward through their web page history that's maintained by your {@link 240android.webkit.WebView}.</p> 241 242<p>To open links clicked by the user, simply provide a {@link 243android.webkit.WebViewClient} for your {@link android.webkit.WebView}, using {@link 244android.webkit.WebView#setWebViewClient(WebViewClient) setWebViewClient()}. For example:</p> 245 246<pre> 247WebView myWebView = (WebView) findViewById(R.id.webview); 248myWebView.{@link android.webkit.WebView#setWebViewClient(WebViewClient) setWebViewClient}(new WebViewClient()); 249</pre> 250 251<p>That's it. Now all links the user clicks load in your {@link android.webkit.WebView}.</p> 252 253<p>If you want more control over where a clicked link load, create your own {@link 254android.webkit.WebViewClient} that overrides the {@link 255android.webkit.WebViewClient#shouldOverrideUrlLoading(WebView,String) 256shouldOverrideUrlLoading()} method. For example:</p> 257 258<pre> 259private class MyWebViewClient extends WebViewClient { 260 @Override 261 public boolean {@link android.webkit.WebViewClient#shouldOverrideUrlLoading(WebView,String) shouldOverrideUrlLoading}(WebView view, String url) { 262 if (Uri.parse(url).getHost().equals("www.example.com")) { 263 // This is my web site, so do not override; let my WebView load the page 264 return false; 265 } 266 // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs 267 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 268 startActivity(intent); 269 return true; 270 } 271} 272</pre> 273 274<p>Then create an instance of this new {@link android.webkit.WebViewClient} for the {@link 275android.webkit.WebView}:</p> 276 277<pre> 278WebView myWebView = (WebView) findViewById(R.id.webview); 279myWebView.{@link android.webkit.WebView#setWebViewClient(WebViewClient) setWebViewClient}(new MyWebViewClient()); 280</pre> 281 282<p>Now when the user clicks a link, the system calls 283{@link android.webkit.WebViewClient#shouldOverrideUrlLoading(WebView,String) 284shouldOverrideUrlLoading()}, which checks whether the URL host matches a specific domain (as defined 285above). If it does match, then the method returns false in order to <em>not</em> override the URL 286loading (it allows the {@link android.webkit.WebView} to load the URL as usual). If the URL host 287does not match, then an {@link android.content.Intent} is created to 288launch the default Activity for handling URLs (which resolves to the user's default web 289browser).</p> 290 291 292 293 294<h3 id="NavigatingHistory">Navigating web page history</h3> 295 296<p>When your {@link android.webkit.WebView} overrides URL loading, it automatically accumulates a 297history of visited web 298pages. You can navigate backward and forward through the history with {@link 299android.webkit.WebView#goBack()} and {@link android.webkit.WebView#goForward()}.</p> 300 301<p>For example, here's how your {@link android.app.Activity} can use the device <em>Back</em> button 302to navigate backward:</p> 303 304<pre> 305@Override 306public boolean {@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown}(int keyCode, KeyEvent event) { 307 // Check if the key event was the Back button and if there's history 308 if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.{@link android.webkit.WebView#canGoBack() canGoBack}() { 309 myWebView.{@link android.webkit.WebView#goBack() goBack}(); 310 return true; 311 } 312 // If it wasn't the Back key or there's no web page history, bubble up to the default 313 // system behavior (probably exit the activity) 314 return super.onKeyDown(keyCode, event); 315} 316</pre> 317 318<p>The {@link android.webkit.WebView#canGoBack()} method returns 319true if there is actually web page history for the user to visit. Likewise, you can use {@link 320android.webkit.WebView#canGoForward()} to check whether there is a forward history. If you don't 321perform this check, then once the user reaches the end of the history, {@link 322android.webkit.WebView#goBack()} or {@link android.webkit.WebView#goForward()} does nothing.</p> 323 324 325 326 327 328 329