与Chrome和Firefox等其他浏览器类似,我需要用户长按一个链接然后显示上下文菜单,但是如果他们长时间点击某些内容并且它不是链接则不执行任何操作。
使用registerForContextMenu(myWebView);
可以长按任何我不想要的对象。因此,我认为需要从registerForContextMenu(myWebView);
过滤对象或解析html以寻找看似矫枉过正的链接。我也试过重写shouldOverrideUrlLoading
方法:
private boolean isLongClicked = false;
this.webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(isLongCLicked){
//do something
}else
view.loadUrl(url);
return true;
}
});
webView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
isLongClicked = true;
forumView.performClick();
isLongCLicked = false;
return false;
}
});
我看过这个帖子Enable longClick in WebView,但它没有帮助我。我试着实施它,但我得到了一个力量。
import android.content.Context;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.webkit.WebView;
public class WebViewSub extends WebView {
public WebViewSub(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@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("save image")
.setOnMenuItemClickListener(handler);
menu.add("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("Save Link")
.setOnMenuItemClickListener(handler);
menu.add("Share Link")
.setOnMenuItemClickListener(handler);
}
}
}
最后我尝试使用HitTestResult,这可能是我最接近解决问题的方法。
myWebView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
registerForContextMenu(myWebView);
WebView.HitTestResult result = forumView.getHitTestResult();
if(result.getType() == 7){
openContextMenu(myWebView);
}
unregisterForContextMenu(myWebView);
return false;
}
});
这仅适用于链接,但我的上下文菜单显示为空白矩形。我已经尝试使用实际的OnLongClick视图但它似乎也没有工作。我不认为我的上下文菜单是错误的;它在OnLongClick之外工作。
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.click, menu);
}
如何让菜单正确显示?我想我正在使用HitTestResult onLongClick。
编辑(答案):
myWebView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
unregisterForContextMenu(myWebView);
WebView.HitTestResult result = forumView.getHitTestResult();
if(result.getType() == 7){
registerForContextMenu(myWebView);
}
return false;
}
});
每次长按此按钮都会取消注册上下文菜单,然后注册它,弹出菜单。我相信这是有效的,因为只要单击一个链接,它就会取消注册已注册的上下文菜单,然后决定它是否是一个拉出上下文菜单的链接。以前,它不会给用户时间选择一个选项,并在注册上下文菜单后立即取消注册。
答案 0 :(得分:0)
这实际上是我最近遇到的一种情况,由于我一直在努力的应用程序 - 你到达的解决方案与我实现的解决方案基本相同,所以这里是为了完成:
webView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
unregisterForContextMenu(webView);
WebView.HitTestResult result = webView.getHitTestResult();
if (result.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE) {
registerForContextMenu(webView);
} else {
return true;
}
return false;
}
请注意,使用result.getExtra()
,您将从WebView检索过滤结果,在本例中为a HTML::a tag with src=http
。
请注意,我还通过返回true(已处理)来忽略WebView上的任何其他长按。