Как и в других браузерах, таких как 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;
}
});
Я просмотрел эту тему Включить longClick в 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 View, но он тоже не работает. Я не думаю, что мое контекстное меню ошибочно; он работал вне 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;
}
});
Каждый раз при длительном нажатии это отменяет контекстное меню, затем регистрирует его, вызывая меню. Я считаю, что это работает, потому что, как только нажимается ссылка, она отменяет регистрацию зарегистрированного контекстного меню, а затем решает, ссылается ли ссылка на контекстное меню. Раньше это не давало пользователю времени выбрать вариант и сразу после регистрации контекстного меню отменить его регистрацию.