Podobnie jak w przypadku innych przeglądarek, takich jak Chrome i Firefox, potrzebuję, aby użytkownik długo kliknął link, a następnie wyświetliło menu kontekstowe, ale jeśli długo kliknęło coś i nie jest to link, to nie rób nic.Wyświetlenie strony w systemie Android, ustawienie Włączone z długim kliknięciem tylko w linkach?
Używanie registerForContextMenu(myWebView);
pozwala na długie kliknięcie dowolnego obiektu, którego nie chcę. Dlatego myślę, że trzeba odfiltrować obiekty z registerForContextMenu(myWebView);
lub parsować html dla linków, które wydają się przesadzone. Próbowałem również nadrzędne shouldOverrideUrlLoading
metody:
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;
}
});
Szukałem w tym wątku Enable longClick in WebView ale nie pomógł mi. Próbowałem go wdrożyć, ale zbliżam się do siły.
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);
}
}
}
Wreszcie Próbowałem przy użyciu HitTestResult, To jest chyba najbliżej mam do rozwiązania problemu.
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;
}
});
To działa tylko na łączach, jednak mój menu kontekstowego wyświetla jako pusty prostokąt. Próbowałem używać rzeczywistego widoku OnLongClick, ale nie wydaje się również działać. Nie uważam, że moje Menu kontekstowe jest błędne; działało poza OnLongClick.
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.click, menu);
}
Jak uzyskać prawidłowe wyświetlanie menu? Myślę, że jestem na dobrej drodze, używając HitTestResult onLongClick.
Edit (ODPOWIEDŹ):
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;
}
});
każdym razem na długi Kliknij ten wyrejestrowanie menu kontekstowego następnie rejestruje go, pojawiały się w menu. Wierzę, że działa to, ponieważ po kliknięciu łącza wyrejestrowuje ono zarejestrowane menu kontekstowe, a następnie decyduje, czy jest to link do menu kontekstowego. Wcześniej nie dałoby to użytkownikowi czasu na wybranie opcji i natychmiast po zarejestrowaniu menu kontekstowego wyrejestruj ją.
Co to jest forumview? – WideFide
forumview == webView :) –