【发布时间】:2011-03-27 19:40:08
【问题描述】:
在浏览器中,您可以长按 URL。在我的 WebView 中,你不能。我怎样才能做到让你能做到?
【问题讨论】:
标签: android browser click webview
在浏览器中,您可以长按 URL。在我的 WebView 中,你不能。我怎样才能做到让你能做到?
【问题讨论】:
标签: android browser click webview
基于@peeyush answer,代码更短:
webView.setOnLongClickListener { view ->
val result = (view as WebView).hitTestResult
extra?.let { link ->
// do sth with link
}
true
}
【讨论】:
我只是想在长按时复制 URL 数据。
通过参考接受的答案,我写了这个。
registerForContextMenu(webView);
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
WebView webView = (WebView) v;
HitTestResult result = webView.getHitTestResult();
if (result != null) {
if (result.getType() == HitTestResult.SRC_ANCHOR_TYPE) {
String linkToCopy = result.getExtra();
copyToClipboard(linkToCopy, AppConstants.URL_TO_COPY);
}
}
}
【讨论】:
我遇到了同样的问题。
很遗憾,我找不到让标准浏览器菜单选项出现的方法。你必须自己实现每一个。我所做的是使用activity.registerForContextMenu(webView) 为上下文菜单注册 WebView。然后我继承了 WebView 并覆盖了这个方法:
@Override
protected void onCreateContextMenu(ContextMenu menu) {
super.onCreateContextMenu(menu);
HitTestResult result = getHitTestResult();
MenuItem.OnMenuItemClickListener handler = new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
// do the menu action
return true;
}
};
if (result.getType() == HitTestResult.IMAGE_TYPE ||
result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
// Menu options for an image.
//set the header title to the image url
menu.setHeaderTitle(result.getExtra());
menu.add(0, ID_SAVEIMAGE, 0, "Save Image").setOnMenuItemClickListener(handler);
menu.add(0, ID_VIEWIMAGE, 0, "View Image").setOnMenuItemClickListener(handler);
} else if (result.getType() == HitTestResult.ANCHOR_TYPE ||
result.getType() == HitTestResult.SRC_ANCHOR_TYPE) {
// Menu options for a hyperlink.
//set the header title to the link url
menu.setHeaderTitle(result.getExtra());
menu.add(0, ID_SAVELINK, 0, "Save Link").setOnMenuItemClickListener(handler);
menu.add(0, ID_SHARELINK, 0, "Share Link").setOnMenuItemClickListener(handler);
}
}
如果您想执行上下文菜单以外的操作,请使用OnLongClickListener。但是你想拦截长点击事件,HitTestResult 是关键。这样您就可以了解用户点击了什么并对其进行操作。
我自己并没有真正实现“保存链接”,我只是把它作为一个例子在这里。但要这样做,您必须自己完成所有处理;您必须发出 HTTP GET 请求,接收响应,然后将其存储在用户 SD 卡的某个位置。据我所知,没有办法直接调用浏览器应用程序的下载活动。您的“保存链接”代码将如下所示:
HitTestResult result = getHitTestResult();
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(result.getExtra());
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
URL url = new URL(result.getExtra());
//Grabs the file part of the URL string
String fileName = url.getFile();
//Make sure we are grabbing just the filename
int index = fileName.lastIndexOf("/");
if(index >= 0)
fileName = fileName.substring(index);
//Create a temporary file
File tempFile = new File(Environment.getExternalStorageDirectory(), fileName);
if(!tempFile.exists())
tempFile.createNewFile();
InputStream instream = entity.getContent();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
//Read bytes into the buffer
ByteArrayBuffer buffer = new ByteArrayBuffer(50);
int current = 0;
while ((current = bufferedInputStream.read()) != -1) {
buffer.append((byte) current);
}
//Write the buffer to the file
FileOutputStream stream = new FileOutputStream(tempFile);
stream.write(buffer.toByteArray());
stream.close();
}
【讨论】:
onCreateContextMenu 中,您可以查看hitResult.getExtra() 给出的 URL,然后决定是否要创建菜单项或启动浏览器。
我认为你可以使用这样的东西:
WebView yourWebView;
yourWebView.setLongClickable(true);
yourWebView.setOnLongClickListener(...);
这应该可以让您捕捉到对视图的长时间点击。之后你会做什么......这取决于你!
【讨论】:
我会在 webview 中启用 Javascript。然后使用 onMouseDown() 和 onMouseUp() 来确定点击的时长。
您也可以在 Javascript 中创建弹出菜单(不是标准菜单,而是您自己的)。
您终于可以在 Javascript 和您的 Android/Java 代码之间进行交互了。
Javascript 和 Android 应用程序之间的简单交互示例。
http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/assets/demo.html
或者,您可能想要启动真正的浏览器而不是使用 WebView。
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://example.com"));
startActivity(intent);
【讨论】: