Seb*_*ian 10 url android image webview webviewclient
我尝试捕获webview longclicks以显示上下文菜单.(请参阅下面的代码)当长按图像时,我总是将图像URL作为额外的(对于具有IMAGE_TYPE的未链接图像和具有SRC_IMAGE_ANCHOR_TYPE的链接图像).但是如何获得带有超链接的图像的链接URL(而不是图像URL)呢?
最好,塞巴斯蒂安
mywebview.setOnLongClickListener(new OnLongClickListener() {
public boolean onLongClick(View v) {
final WebView webview = (WebView) v;
final WebView.HitTestResult result = webview.getHitTestResult();
if (result.getType() == SRC_ANCHOR_TYPE) {
return true;
}
if (result.getType() == SRC_IMAGE_ANCHOR_TYPE) {
return true;
}
if (result.getType() == IMAGE_TYPE) {
return true;
}
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
Per*_*_ml 20
在Android 4.2.2上,上述解决方案都不适用于我.所以我研究了默认的android web浏览器的源代码.我解决了这个问题的解决方案 - 从图像链接获取链接URL.
资料来源:https: //github.com/android/platform_packages_apps_browser/blob/master/src/com/android/browser/Controller.java
提取的解决方案:
LongClick监听器:
...
mWebview.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
HitTestResult result = mWebview.getHitTestResult();
if (result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
Message msg = mHandler.obtainMessage();
mWebview.requestFocusNodeHref(msg);
}
}
});
...
Run Code Online (Sandbox Code Playgroud)
处理程序获取URL:
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// Get link-URL.
String url = (String) msg.getData().get("url");
// Do something with it.
if (url != null) ...
}
};
Run Code Online (Sandbox Code Playgroud)
小智 6
我知道这是一个老问题,但是我最近遇到了这个问题。基于Perry_ml的答案,我使用下面的Kotlin代码来解决它:
webView.setOnLongClickListener {
val result = webView.hitTestResult
if (result.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
val handler = Handler()
val message = handler.obtainMessage()
webView.requestFocusNodeHref(message)
val url = message.data.getString("url")
// Do something with url, return true as touch has been handled
true
} else {
false
}
}
Run Code Online (Sandbox Code Playgroud)
我检查了WebView的源代码,似乎图像uri是SRC_IMAGE_ANCHOR_TYPE可以获得的唯一额外数据.但请不要生气,我有一个快速而肮脏的解决方法:
webview.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
final WebView webview = (WebView) v;
final HitTestResult result = webview.getHitTestResult();
if(result.getType()==HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
webview.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 2. and here we get the url (remember to remove the WebView client and return true so that the hyperlink will not be really triggered)
mUrl = url; // mUrl is a member variant of the activity
view.setWebViewClient(null);
return true;
}
});
// 1. the picture must be focused, so we simulate a DPAD enter event to trigger the hyperlink
KeyEvent event1 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER);
webview.dispatchKeyEvent(event1);
KeyEvent event2 = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER);
webview.dispatchKeyEvent(event2);
// 3. now you can do something with the anchor url (and then clear the mUrl for future usage)
String url = mUrl;
if (url!=null) {
Toast.makeText(webview.getContext(), url, Toast.LENGTH_SHORT).show();
}
mUrl = null;
}
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
我在低端Android 2.1设备和高端Android 4.0设备上尝试了这些代码,两者都像魅力一样.
问候
陈子腾
| 归档时间: |
|
| 查看次数: |
10817 次 |
| 最近记录: |