- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Android开发笔记之探秘WebView由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
概述: 一个显示网页的视图。这个类是你可以滚动自己的Web浏览器或在你的Activity中简单地显示一些在线内容的基础。它使用了WebKit渲染引擎来显示网页,包括向前和向后导航的方法(通过历史记录),放大和缩小,执行文本搜索等.
需要注意的是:为了让你的应用能够使用WebView访问互联网和加载网页,你必须添加Internet的权限在Android Manifest文件中:
1
|
<uses-permission android:name=
"android.permission.INTERNET"
/>
|
类结构:
1
2
3
4
5
|
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.widget.AbsoluteLayout
↳ android.webkit.WebView
|
常用方法:
。
WebSettings
|
getSettings()
获取设置WebView的WebSettings对象。
|
void
|
setWebViewClient(WebViewClient client)
设置将接收各种通知和请求的WebViewClient。
|
void
|
setWebChromeClient(WebChromeClient client)
设置chrome处理。
|
。
说明:
WebSettings getSettings()获取设置WebView的WebSettings对象.
WebSettings常用方法:
。
方法
|
说明
|
setAllowFileAccess
|
启用或禁用WebView访问文件数据
|
setBlockNetworkImage
|
是否显示网络图像
|
setBuiltInZoomControls
|
设置是否支持缩放
|
setCacheMode
|
设置缓冲的模式
|
setDefaultFontSize
|
设置默认的字体大小
|
setDefaultTextEncodingName
|
设置在解码时时候用的默认编码
|
setFixedFontFamily
|
设置固定使用的字体
|
setJavaScriptEnabled
|
设置是否支持Javascript
|
setLayoutAlgorithm
|
设置布局方式
|
setLightTouchEnabled
|
设置用鼠标激活被选项
|
setSupportZoom
|
设置是否支持变焦
|
。
void setWebViewClient(WebViewClient client) 。
设置将接收各种通知和请求的WebViewClient.
WebViewClient 常用方法:
。
方法
|
说明
|
doUpdateVisitedHistory
|
更新历史记录
|
onFormResubmission
|
应用程序重新请求网页数据
|
onLoadResource
|
加载指定地址提供的资源
|
onPageFinished
|
网页加载完毕
|
onPageStarted
|
网页开始加载
|
onReceivedError
|
报告错误信息
|
onScaleChanged
|
WebView发生改变
|
shouldOverrideUrlLoading
|
控制新的连接在当前WebView中打开
|
。
void setWebChromeClient(WebChromeClient client) 设置chrome处理.
WebChromeClient常用方法:
。
方法
|
说明
|
onCloseWindow
|
关闭WebView
|
onCreateWindow
|
创建WebView
|
onJsAlert
|
处理Javascript中的Alert对话框
|
onJsConfirm
|
处理Javascript中的Confirm对话框
|
onJsPrompt
|
处理Javascript中的Prompt对话框
|
onProgressChanged
|
加载进度条改变
|
onReceivedlcon
|
网页图标更改
|
onReceivedTitle
|
网页Title更改
|
onRequestFocus WebView
|
显示焦点
|
。
自定义WebView,你可以添加你自己的行为: 创建和设置WebChromeClient子类。当一些可能影响浏览器的用户界面发生了,例如,进度更新和JavaScript警报送到这里(见调试任务)调用这个类。 创建和设置WebViewClient子类。当影响内容呈现的事情发生是调用这个类,例如,错误或表单提交。您也可以拦截的URL加载到这里(通过shouldOverrideUrlLoading())。 修改WebSettings,如以setJavaScriptEnabled()方式启用JavaScript。 将Java对象通过addJavascriptInterface(Object,String)方法注射到WebView。 这方法允许您将Java对象注入到一个页面的JavaScript上下文,这样他们可以通过JavaScript访问的页面。 下面是一个更加复杂的例子,显示错误处理,设置和进展通知
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
// Let's display the progress in the activity title bar, like the
// browser appdoes.
getWindow().requestFeature(Window.FEATURE_PROGRESS);
webview.getSettings().setJavaScriptEnabled(
true
);
final
Activity activity =
this
;
webview.setWebChromeClient(
new
WebChromeClient() {
public
void
onProgressChanged(WebView view,
int
progress) {
//Activities and WebViews measure progress with different scales.
//The progress meter will automatically disappear when we reach 100%
activity.setProgress(progress *
1000
);
}
});
webview.setWebViewClient(
new
WebViewClient() {
public
void
onReceivedError(WebView view,
int
errorCode, String description, String failingUrl) {
Toast.makeText(activity,
"Oh no! "
+ description, Toast.LENGTH_SHORT).show();
}
});
webview.loadUrl(
"http://developer.android.com/"
);
|
缩放: 可以通过 设置 WebSettings.setBuiltInZoomControls(boolean) ,启用内置缩放.
注意:使用缩放,如果不是高度或宽度设置为WRAP_CONTENT可能会导致不确定的行为,应该避免.
Cookie 和窗口管理: 出于显而易见的安全原因,您的应用程序都有自己的缓存,cookie存储等,它不共享浏览器应用程序的数据.
默认情况下,通过HTML请求打开新的窗口将被忽略。这是确切的它们是被JavaScript打开还是被目标链接打开。您可以自定义您的WebChromeClient提供自己的行为打开多个窗口,并使用你想要的任何方式渲染它们.
WebView中构建Web应用程序: 如果你想提供一个Web应用程序(或只是一个网页)作为客户端应用程序的一部分,你可以使用WebView做到这一点。WebView类是Android的View类的一个扩展,它可以让你显示网页作为你的活动布局的一部分。它不包括一个完全开发的Web浏览器的任何功能,如导航控件或一个地址栏。所有的WebView默认情况下是显示一个Web页面.
一个使用WebView的常见的场景:是当你想要在你的应用程序中提供可能需要更新的信息,如一个终端用户协议或用户指南,那么使用WebView是很有帮助的。 在你的Android应用程序中你可以创建一个包含WebView的Activity然后用它来显示的在线托管的文档.
另一个使用WebView的常见的场景:是如果你的应用程序提供的数据总是需要从Internet上获取,如电子邮件。在这种情况下,你可能会发现它更容易在你的Android应用程序,显示所有的用户数据的网页,而不是执行一个网络请求,然后解析数据,并渲染它在Android的布局,以建立一个WebView。相反,你可以设计的专为Android设备的网页,然后实施的WebView在你的Android应用程序加载的网页.
下面将向你展示如何开始使用WebView,以及如何做一些额外的事情,比如在你的Android应用程序中处理页面导航和从网页上绑定JavaScript到客户端的代码.
基本用法: 默认情况下,WebView不提供类似浏览器的窗口小部件,不启用JavaScript和网页错误被忽略。如果你的目的只是显示一些HTML作为用户界面的一部分,这也许还不错;用户将不再需要与网页进行交互阅读,并且该网页将不需要与用户进行交互。如果你需要一个全面的Web浏览器,那么你可能要调用浏览器应用程序来加载URL,而不是用WebView中显示它。例如:
1) 在你的APP中添加一个WebView:
1
2
3
4
5
6
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<WebView xmlns:android=
"http://schemas.android.com/apk/res/android"
android:id=
"@+id/webview"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
/>
|
2) 使用loadUrl()方法加载一个web页面:
1
2
|
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl(
"http://www.example.com"
);
|
3) 给应用程序添加访问网络的权限:
1
2
3
|
<manifest ... >
<uses-permission android:name=
"android.permission.INTERNET"
/>
</manifest>
|
以上就是显示一个最基本的web页面所有的步骤。 在WebView中使用JavaScript : 如果你计划在你的WebView加载网页时使用JavaScript,你必须为你的WebView启用JavaScript。一旦启用JavaScript,你还可以创建你的应用程序代码和JavaScript代码之间的接口.
JavaScript在WebView中默认情况下是被禁用的。你可以通过附加在WebView上的WebSettings启用它。即使用getSettings()获取WebSettings ,然后启用使用setJavaScriptEnabled()方法启用JavaScript.
。
1
2
3
|
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(
true
);
|
JavaScript代码绑定到Android代码: 在开发一个web应用程序,专门设计的WebView在你的Android应用程序中,您可以创建您的JavaScript代码和客户端Android代码之间的接口。例如,您的JavaScript代码可以在你的Android代码中调用一个方法来显示Dialog,而不是使用JavaScriptalert()方法.
调用addJavascriptInterface()方法绑定一个新的JavaScript和Android代码之间的接口。通过它 一个类实例绑定到你的JavaScrip,JavaScript可以调用一个接口名称访问类.
1
2
3
4
5
6
7
8
9
10
11
12
|
public
class
WebAppInterface {
Context mContext;
/** Instantiatethe interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
/** Show a toastfrom the web page */
@JavascriptInterface
public
void
showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
}
|
注意:如果你设置的targetSdkVersion为17或更高,则必须添加@JavascriptInterface为任何您想要提供给您的JavaScript(该方法必须是public)方法添加标注。如果你不提供注解,在Android4.2或更高版本上运行时该方法是不能被网页访问的。 在上面这个例子中,WebAppInterface 类允许网页调用showToast()方法创建一个Toast 消息.
你可以通过addJavascriptInterface()方法和Android接口名,绑定这个类到运行在你的WebView中的JavaScript上.
1
2
|
WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(
new
WebAppInterface(
this
),
"Android"
);
|
。
这将为运行在WebView中的JavaScript创建一个名为Android的接口。在这一点上,Web应用程序可以访问WebAppInterface类。例如,下面是一些HTML和JavaScript在单击按钮的时候将创建一个Toast消息.
1
2
3
4
5
6
|
<input type=
"button"
value=
"Sayhello"
onClick=
"showAndroidToast('Hello Android!')"
/>
<script type=
"text/javascript"
>
function showAndroidToast(toast) {
Android.showToast(toast);
}
</script>
|
这不需要从JavaScript接口初始化Android。 WebView自动的将它应用到你的web页面中。 因此,按下按钮showAndroidToast()方法使用Android接口调用WebAppInterface.showToast()方法。 注:绑定到你的JavaScript对象运行在另一个线程,而不是在它构建的线程.
警告:使用addJavascriptInterface()将允许 JavaScript来控制你的Android应用程序。 这是一个非常有用的特性或危险的安全问题。 当WebView的HTML是不值得信任的(例如,部分或全部的HTML是由一个不知名的人或进程提供的),那么攻击将者执行包括在HTML和选择的任何客户端代码。因此,不应该使用addJavascriptInterface()除非你写的所有HTML和JavaScript出现在你WebView。 你应该也不允许用户导航到其他不是自己的网页,,在你的WebView内(相反,允许用户的通过默认浏览器应用程序打开外部链接。应用的web浏览器打开所有的URL链接,所以要小心你只有在处理页面导航中描述以下部分).
处理页面导航: 当用户单击在WebView上的链接时,默认行为是启动一个处理URL的Android应用。通常默认网页浏览器打开和装在目的URL。但是你可以为WebView覆盖这个行为,以便在你的WebView上打开链接。然后,您可以允许用户前后浏览通过的由您的WebView保留的网页历史记录.
要打开用户点击链接,只是提供一个WebViewClient为您的WebView,使用setWebViewClient().
1
2
|
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(
new
WebViewClient());
|
这样。用户点击的所有的链接,都在你的WebView上加载。 如果你想更多的控制点击链接的加载,创建自己的WebViewClient的覆盖shouldOverrideUrlLoading()方法.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
private
class
MyWebViewClient
extends
WebViewClient {
@Override
public
boolean
shouldOverrideUrlLoading(WebView view, String url) {
if
(Uri.parse(url).getHost().equals(
"www.example.com"
)) {
// This is my web site, so do not override;let my WebView load the page
return
false
;
}
// Otherwise, the link is not for a page on my site, so launch anotherActivity that handles URLs
Intent intent =
new
Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return
true
;
}
}
|
然后为WebView创建一个新的WebViewClient实例:
1
2
|
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(
new
MyWebViewClient());
|
现在,当用户点击一个链接时,系统调用shouldOverrideUrlLoading(),它会检查URL主机是否一个特定的域相匹配(定义如上)。如果不匹配,那么为了不重写的URL加载(它允许WebView加载的URL照常)方法返回false。如果URL中的主机不匹配,那么 一个Intent将被创建启动默认的Activity 处理URL(它可以解决用户的默认Web浏览器)。 浏览网页的历史记录: 当你的WebView重载URL加载的时,WebView会自动累加访问过的网页的历史记录。您可以通过goBack()和 goForward()方法向后、向前浏览.
1
2
3
4
5
6
7
8
9
10
11
|
@Override
public
boolean
onKeyDown(
int
keyCode, KeyEvent event) {
// Check if thekey event was the Back button and if there's history
if
((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
myWebView.goBack();
return
true
;
}
// If it wasn'tthe Back key or there's no web page history, bubble up to the default
// systembehavior (probably exit the activity)
return
super
.onKeyDown(keyCode, event);
}
|
如果有一个实际的网页历史记录用户访问的canGoBack()方法返回true。同样地,你可以使用canGoForward()来检查是否有历史前进。如果不执行此检查,那么一旦用户到达历史的终结,GoBack()或goForward()什么也不做.
最后此篇关于Android开发笔记之探秘WebView的文章就讲到这里了,如果你想了解更多关于Android开发笔记之探秘WebView的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要一些说明。我可以直接写入 /dev/port 以直接访问并行端口并且它工作正常(我可以打开插入端口连接器的 LED)。但是,我想我可以用 /dev/mem 做同样的事情? (http://tld
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我使用 Visual C++ 和 Win32 API 学习了 Windows 编程。如今,似乎大多数应用程序都是使用 C# 在 .NET 中开发的。我知道大多数时候 native 代码和托管代码之间没
请耐心等待。我正在制作一个 java 控制台,类似于此处找到的 DragonConsole https://code.google.com/p/dragonconsole/ 。一切都按计划进行,但我想
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭5年前。 Improve this que
Django 的开发服务器表现得很奇怪。访问它的浏览器在加载时卡住,任何退出它的尝试都不起作用。当我点击 control c看似相当,但实际上仍在运行。让它退出的唯一方法是重新启动我的电脑,这很令人沮
我正在使用 Flash Develop,并且创建了一个 ActionScript 3.0 项目。它启动并读取一个 xml 文件,其中包含图像的 url。我已将 url 保留在与 swf 相同的文件夹中
是否可以根据其 website 上提供的规范开发 AUTOSAR BSW 堆栈(例如用于 CAN 通信)?不购买任何昂贵的供应商工具?可以遵循哪些步骤?我被要求探索这种可能性。 最佳答案 是和否。工具
有人知道如何用音频文件的内容覆盖 iPhone 麦克风吗? 想象一个场景,您正在通话,并且想要播放一些简短的音频让其他人听到。 因此,有必要将麦克风(硬件)置于保持状态,并使用委托(delegate)
我遇到了这个问题,我的应用程序出现 EXC_BAD_ACCESS 错误并卡住/停止。我使用模拟器的“向左旋转”和“向右旋转”选项来模拟方向变化行为。导致此错误的可能原因有哪些?由于我没有获得有关错误的
我有超过 1 台 Mac,我想在所有这些 Mac 上进行开发。我知道我需要在每台机器上同步我的手机,但这是我遇到的最小的问题。看起来我无法在手机上运行应用程序,除了在其中之一上开发的应用程序。 是否有
在手机上测试时,我的应用程序在特定点崩溃。控制台显示此消息 Tue Jan 27 15:47:14 unknown SpringBoard[22] : Application com.myprof.
我有一个案例,我从服务器获取信息。我的应用程序有一个选项卡栏和导航按钮。我希望应用程序显示进度指示器并禁用所有其他控件,以便用户在从服务器提取数据时无法跳转。我怎样才能实现这个目标? 我想到的一种方法
有时,当我尝试“构建”/编译下载的源代码时,我会收到以下警告: ld: warning: directory '/Volumes/Skiiing2/CD/ViewBased/Unknown Path/
我无法在 Apple 文档中找到关于开发和分发配置之间差异的明确解释。我目前正在使用开发配置在我的 iPhone 上进行开发和测试。我打算将该应用程序分发到我的 Beta 测试中,我想知道: 我需要使
我在使用 SharePoint 时遇到的最大挑战之一是它不能很好地适应典型的项目环境,其中至少包含开发和生产环境。我遇到的最多的问题是内容和列表是如此紧密地耦合在一起,以至于如果不在生产环境中执行内容
我失败了fist step让 Eclipse(对我来说是全新的)为 ARM 开发做好准备。 我在 Windows 10 中安装了 Eclipse。我想我应该安装 xpm,但我不知道在哪里输入此命令:
首先,我告诉你-我是编码新手 我正在使用vs代码来学习c++,它不会产生像dev c++或codeblocks这样的调试器。我看了一些视频,其中我们必须编辑json文件,这对于初学者来说非常复杂。有人
我失败了fist step让 Eclipse(对我来说是全新的)为 ARM 开发做好准备。 我在 Windows 10 中安装了 Eclipse。我想我应该安装 xpm,但我不知道在哪里输入此命令:
我开发了一个 Ionic 应用程序(iOS 和 Android 的混合)。我有 Xcode 8.3.3 并购买了一年的 Apple Developer Program 订阅。 我不想测试我的应用并将其
我是一名优秀的程序员,十分优秀!