单击链接时,从Android WebView中的锚标记获取href值
Get href value from anchor tag in Android WebView when link is clicked
我正在WebView中加载一个网页。网页中有一个链接,桌面上会下载文件,但在应用程序中,该链接应该显示Toast,表示该链接已被应用程序禁用。
当单击链接时,我不知道如何从锚点标记的href
中获取值。
<a class="btn btn-primary" download="http://xx.xxx.com/wp-content/uploads/2015/11/abc-27-15.mp3" href="http://xx.xxx.com/wp-content/uploads/2015/11/abc-27-15.mp3">
<i class="fa fa-download"></i> Download Audio</a>
有人能分享一个关于如何做到这一点的想法或任何示例代码吗。
编辑:1
以下是我目前正在做的事情:
private static final String URL = "http://xx.xxx.com/wp-content/uploads/";
webView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
WebView.HitTestResult hr = ((WebView) v).getHitTestResult();
String extra = hr.getExtra();
if (extra != null && extra.startsWith(URL) && extra.endsWith(".mp3")) {
Log.d("WebviewActivity", "Extra: " + extra);
Log.d("WebviewActivity", "Contains URL");
return true;
}
}
return false;
}
});
这种方法的问题在于:当我点击链接时,我会得到额外的网址。直到这里都很好用。但是,从下一次开始,无论我在哪里点击网络视图,都会返回相同的额外内容。所以,即使我在点击网址后点击了一张图片,我也会在额外的网址中得到相同的网址。不确定我是否做错了什么。或者这是正确的方法。
如果你需要任何细节,请告诉我。
编辑:2
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) {
Log.d(TAG, "URL: "+url);
}
}
};
webView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
WebView.HitTestResult hr = ((WebView) v).getHitTestResult();
if (hr.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE) {
Message msg = mHandler.obtainMessage();
webView.requestFocusNodeHref(msg);
}
}
return false;
}
});
webView.loadUrl(mUrl);
}
现在,我得到了在最后一个action_down事件中单击的URL。如何获取当前URL?
编辑3(尝试使用webviewclient:
private class MyWebViewClient extends WebViewClient {
private static final String URL = "xx.xxx.com/wp-content/uploads/";
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if (!isFinishing())
mProgressDialog.show();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mProgressDialog.dismiss();
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
Toast.makeText(WebviewActivity.this,
"Please check your internet " + "connection and try again",
Toast.LENGTH_SHORT).show();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d("xxx", "Url: " + url);
if(url.contains(URL)) {
Log.d("xxx", "Url Contains: " + URL);
return true;
}
return false;
}
}
mMyWebViewClient = new MyWebViewClient();
webView.setWebViewClient(mMyWebViewClient);
点击链接时在logcat中的输出:
03-01 15:38:19.402 19626-19626/com.xx.xxx D/cr_Ime: [ImeAdapter.java:553] focusedNodeChanged: isEditable [false]
03-01 15:38:19.428 19626-19626/com.xx.xxx D/cr_Ime: [ImeAdapter.java:253] updateKeyboardVisibility: type [0->0], flags [0], show [true],
03-01 15:38:19.428 19626-19626/com.xx.xxx D/cr_Ime: [ImeAdapter.java:326] hideKeyboard
03-01 15:38:19.429 19626-19626/com.xx.xxx D/cr_Ime: [InputMethodManagerWrapper.java:56] isActive: true
03-01 15:38:19.429 19626-19626/com.xx.xxx D/cr_Ime: [InputMethodManagerWrapper.java:65] hideSoftInputFromWindow
因为您使用的是WebView,而链接不是Java脚本,所以使用WebViewClient可以很容易地实现这一点,您可以使用它来监控WebView
myWebView.setWebViewClient( new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// check something unique to the urls you want to block
if (url.contains("xx.xxx.com")) {
Toast.make... //trigger the toast
return true; //with return true, the webview wont try rendering the url
}
return false; //let other links work normally
}
} );
可能是因为您的URL以.mp3结尾,所以该文件被视为资源。您还应该覆盖WebViewClient的shouldInterceptRequest
方法来进行检查。
@Override
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
Log.d("XXX", "Url from API21 shouldInterceptRequest : " + url);
if (url.contains(URL)) {
return new WebResourceResponse("text/html", "UTF-8", "<html><body>No downloading from app</body></html>");
} else {
return null;
}
}
public WebResourceResponse shouldInterceptRequest (WebView view, String url) {
Log.d("XXX", "Url from shouldInterceptRequest : " + url);
if (url.contains(URL)) {
return new WebResourceResponse("text/html", "UTF-8", "<html><body>No downloading from app</body></html>");
} else {
return null;
}
}
大部分工作都可以在网页端完成。您必须编写java脚本来识别哪个设备正在访问页面(移动设备、桌面等(,如果是移动设备,则使用java脚本绑定技术调用本地android代码来显示Toast消息。
http://developer.android.com/guide/webapps/webview.html
WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(this), "Android");
WebAppInterface.java
public class WebAppInterface {
Context mContext;
/** Instantiate the interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
}
YourHTML页面(此示例点击按钮(
<input type="button" value="Say hello" onClick="showAndroidToast('Hello
Android!')" />
<script type="text/javascript">
function showAndroidToast(toast) {
Android.showToast(toast);
}
</script>
- 获取Href的集合
- React路由器<link>如何在Jest测试中获取href的值
- 单击时获取 href 的顶部主机名
- 单击事件以获取 href 标记(动态创建)
- j查询干净的方法来获取href数组并重建它
- 如何从孩子标签上获取 href
- 通过使用 jQuery 单击多个锚点中的锚点来获取 HREF 值
- 通过Javascript从HTML文件中获取href值
- 如何在CasperJS中获取href属性值
- 单击链接时,从Android WebView中的锚标记获取href值
- 如何获取 href 值并将其用作目标的 ID
- 如何在java中使用Selenium获取href链接的一部分
- 为什么在通过 AJAX 获取 href 的更多参数后无法触发默认单击
- 通过 jQuery 获取 href 值
- Javascript 如何从没有 id 锚标记中获取 href
- 如何使用 JS 获取 href 值
- “$.getScript @href”不会从按钮获取 href,只会从 a 标记中获取
- JavaScript 在单击链接时获取 href
- 使用JavaScript获取href值并打开新窗口
- 从元素中获取href,并将其添加到图像的src属性中