我用WebView编写了一个简单的helloworld应用程序,它在我的资产文件夹的simple.html页面上有一个指向CNN的链接.
<a href="http://cnn.com">cnn.com</a>
Run Code Online (Sandbox Code Playgroud)
如何捕获我的Activity上的单击,停止WebView导航,然后通知Activity 点击了" http://CNN.com "?
我想知道如何确定何时完成 WebView 加载.
让我完全定义.
这个问题的答案很糟糕:
WebViewClient.onPageFinished() - 如果有重定向加载页面,则会多次触发.它也会在页面显示之前触发.
PictureListener.onNewPicture() - 每次屏幕更改时都会触发,每次重定向都会触发AFAICT.我怎么知道哪个射击是最后一个?
WebChromeClient.onProgressChanged() - 与onPageFinished相同的问题.(在David建议以下解决方案后添加)
Thread.sleep(5000) - 应该很明显,为什么这是不可接受的.
当然,上述工作的巧妙组合将是完美的.
为什么我想知道你问这个?因为我想注入一些JavaScript 一次一次Webview是完全完成加载.
我有运行的一个问题嵌入HTML5的Youtube在网页视图.我想在我的应用程序上播放Youtube视频.我决定使用WebView而不是VideoView,因为我想让我的系统更灵活地从网上播放视频.
虽然有很多方法可以在Android上玩youtube,但我会使用youtube嵌入式版本." http://www.youtube.com/embed/___________________ ".因为这是我在你的android不支持flash时发现的解决方案之一.
问题:
WebView正常加载,包括嵌入的Youtube.但是我开始在youtube上看到黑屏.
当我点击它.它仅加载第一个图像,但之后它不播放.我尝试在Android浏览器上播放,它运行顺畅但不在webView中.
知道为什么吗?
以下只是我的代码片段:
WebView wv = new WebView(getApplicationContext());
wv.getSettings().setPluginState(PluginState.ON);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl("http://apiblog.youtube.com/2010/07/new-way-to-embed-youtube-videos.html");
setContentView(wv);
Run Code Online (Sandbox Code Playgroud)
以下是我发现非常有用的一些资源:
http://apiblog.youtube.com/2010/07/new-way-to-embed-youtube-videos.html
http://www.broken-links.com/2009/10/06/building-html5-video-controls-with-javascript/
提前感谢您的支持和帮助:)
更新(2011年6月13日):
我成功加载了WebView中的http://m.youtube.com,但无法播放任何视频.但是当我尝试在我的Android浏览器上加载URL时,它可以播放.
从这里开始,我注意到我的WebView上的youtube站点没有登录.那么我们如何允许WebView使用与我手机中的Youtube帐户相同的凭据?它真的有效吗?
我认为标题几乎涵盖了它,但我的活动中有一个webview.我已经在网页视图中加载了一个网址,我想要整个页面的截图(视口中的内容以及"下方"的内容).
我有代码可以对视口进行快照,我知道这可以通过在快照之前放大webview来在iOS中完成.我试过在这里使用相同的技术:
WebView browserView = (WebView) findViewById(R.id.browserView);
//Resize the webview to the height of the webpage
int pageHeight = browserView.getContentHeight();
LayoutParams browserParams = browserView.getLayoutParams();
browserView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, pageHeight));
//Capture the webview as a bitmap
browserView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(browserView.getDrawingCache());
browserView.setDrawingCacheEnabled(false);
//Create the filename to use
String randomFilenamepart = String.valueOf(new SecureRandom().nextInt(1000000));
String filename = Environment.getExternalStorageDirectory().toString() + "/Screenshot_" + randomFilenamepart + ".jpg";
File imageFile = new File(filename);
//Stream the file out to external storage as a JPEG
OutputStream fout = null;
try { …Run Code Online (Sandbox Code Playgroud) 我在Android WebView中有一个复杂的,交互式的HTML5 - 它基本上可以在除Galaxy S3之外的所有平台上正常工作.在Galaxy S3(Android 4.0.4)上,每5次左右,在加载完成后,/ system/lib/libwebcore.so尝试在[各地址]访问无效内存和致命信号11(SIGSEGV) ](code = 1)被抛出.
HTML5是一场微小的战斗,敌人出现,用户斜线进行.在战斗之间是正常的html页面:正常页面 - > HTML5战斗 - >正常页面 - > HTML5战斗 - >正常页面 - > HTML5战斗.HTML5没有做任何特别开箱即用的事情 - 有很多-webkit-animation调用......
.enemy {
position:absolute;
opacity:0;
-webkit-animation:enemyAnim 0.6s linear 0.2s;
}
Run Code Online (Sandbox Code Playgroud)
...引用了很多-webkit-keyframes ......
@-webkit-keyframes enemyAnim {
from {
-webkit-transform: matrix(1, 0, 0, 1, 144.25, 150.25) scale(1, 1);
opacity:1;
}
8.33% {
-webkit-transform: matrix(1, 0, 0, 1, 189.406, 102.206) scale(1.3066, 1.3066);
opacity:1;
}
16.66% {
-webkit-transform: matrix(1, 0, 0, 1, 200.424, 82.649) scale(1.414, 1.414);
opacity:1;
} …Run Code Online (Sandbox Code Playgroud) 我们正在创建一个使用webview的应用程序,并将访问用户需要上传文件的页面.我们遇到Android 4.4问题,文件选择器无法打开,单击上传按钮不会发生任何事情.此功能适用于使用openFileChooser方法的早期版本,如下所示:
webview.setWebChromeClient(new WebChromeClient() {
//The undocumented magic method override
//Eclipse will swear at you if you try to put @Override here
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
}
// For Android 3.0+
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
MainActivity.this.startActivityForResult(
Intent.createChooser(i, "File Browser"),
FILECHOOSER_RESULTCODE);
}
//For Android 4.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, …Run Code Online (Sandbox Code Playgroud) 有没有可靠的方法让Espresso等待WebViews完成加载?
我希望有人有一个没有任何这些缺点的解决方案.我曾希望espresso-web软件包可以提供解决方案,但它似乎没有提供与加载有关的任何内容.
我在使用Android中的WebView进行选择时遇到了一些麻烦.
我可以让WebView进入选择模式.我甚至可以将它复制到ClipBoard.但我真正想做的是永久地突出选择.
因此,想法是将WebView置于选择模式.让用户选择文本,然后触发某些内容以突出显示该文本.我可以通过从剪贴板中获取所选文本来使其工作,然后在Javascript中搜索它并突出显示它.当用户选择真正的常用词时会出现问题.我必须要么突出显示它们,要么以某种方式找出选择的位置以获得正确的选择.
我试过这个适用于iPhone的JavaScript.Bu getSelection()似乎不适用于Android.
function highlight(colour) {
var range, sel;
if (window.getSelection) {
// Non-IE case
sel = window.getSelection();
if (sel.getRangeAt) {
range = sel.getRangeAt(0);
}
document.designMode = "on";
if (range) {
sel.removeAllRanges();
sel.addRange(range);
}
// Use HiliteColor since some browsers apply BackColor to the whole block
if ( !document.execCommand("HiliteColor", false, colour) ) {
document.execCommand("BackColor", false, colour);
}
document.designMode = "off";
} else if (document.selection && document.selection.createRange) {
// IE case
range = document.selection.createRange();
range.execCommand("BackColor", false, colour);
}
} …Run Code Online (Sandbox Code Playgroud) 我遇到了这个Android WebView功能WebSettings.setDomStorageEnabled(true),仅凭名称我可以推断它只是"启用DOM存储".
但是,Android文档提示了一些略有不同的内容:
设置是否启用DOM存储API.
IOW,它启用API而不是存储本身.
我的问题是......在遇到这个函数之前,我不知道是否存在这样的API.
我的Google搜索表明此API与HTML5密切相关.
WebSettings.setDomStorageEnabled(true)
在使用Android应用程序时,我需要注意哪些问题或警告
?更新:我现在至少可以回答问题#2:事实证明"DOM存储"的通用名称是"Web存储",并且有一篇关于此的整篇维基百科文章:http://en.wikipedia.org/wiki/Web_Storage