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;
}
});
ロングクリックするたびに、コンテキストメニューの登録が解除されてから登録され、メニューがポップアップします。リンクがクリックされるとすぐに、登録されているコンテキスト メニューの登録が解除され、コンテキスト メニューをプルするためのリンクであるかどうかが判断されるため、これはうまくいくと思います。以前は、ユーザーがオプションを選択する時間がなく、コンテキスト メニューを登録した直後に登録解除していました。