2011-02-03 14 views
5

Aktualnie próbuję uzyskać niestandardowy widok WebView, który wyświetla menu kontekstowe, gdy zostanie naciśnięty przez dłuższy czas. Jak tylko domyślna klasa WebView wyświetla ContextMenu gdy związek jest longPressed pisałem moje własne klasy aby przesłonić to zachowanie:Android: Otwieranie menu kontekstowego z onLongPress w niestandardowym widoku WebView

public class MyWebView extends WebView { 
    Context context; 
    GestureDetector gd; 

    public MyWebView(Context context, AttributeSet attributes) { 
     super(context, attributes); 
     this.context = context; 
     gd = new GestureDetector(context, sogl); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     return gd.onTouchEvent(event); 
    } 

    GestureDetector.SimpleOnGestureListener sogl = 
       new GestureDetector.SimpleOnGestureListener() { 

     public boolean onDown(MotionEvent event) { 
      return true; 
     } 

     public void onLongPress(MotionEvent event) { 
      // The ContextMenu should probably be called here 
     } 
    }; 
} 

To działa bez problemów, longPress jest wykrywany i metoda onLongPress nazywa, jednak jestem ze stratą, jeśli chodzi o wyświetlanie ContextMenu. Próbowałem robi to zwykły sposób, w mojej działalności:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layout); 

    MyWebView mwv = (MyWebView) findViewById(R.id.mwv); 
    registerForContextMenu(mwv); 
} 

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
        ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context, menu); 
} 

Jednak, kiedy longPress się MyWebView w emulatorze, nic się nie dzieje. Co muszę wywołać z onLongPress(), aby wyświetlić ContextMenu?

Odpowiedz

1

Zadzwoń do Activity.openContextMenu (Zobacz v) w onLongPress. Oznaczałoby to, że MyWebView zachowuje odwołanie do działania.

3

Mam to działa teraz, opierając się na sugestii gngr44. Zrobiłem swoją działalność implementując klasę OnLongClickListener i udostępniłem metodę onLongClick(), która otwiera menu kontekstowe.

Zmieniony kod:

Zwyczaj WebView:

public class MyWebView extends WebView { 
    MyActivity theListener; 
    Context context; 
    GestureDetector gd; 

    public MyWebView(Context context, AttributeSet attributes) { 
     super(context, attributes); 
     this.context = context; 
     gd = new GestureDetector(context, sogl); 
    } 

    // This is new 
    public void setListener(MyActivity l) { 
     theListener = l; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     return gd.onTouchEvent(event); 
    } 

    GestureDetector.SimpleOnGestureListener sogl = 
       new GestureDetector.SimpleOnGestureListener() { 

     public boolean onDown(MotionEvent event) { 
      return true; 
     } 

     public void onLongPress(MotionEvent event) { 
      theListener.onLongClick(MyWebView.this); 
     } 
    }; 
} 

Moja Aktywność:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layout); 

    MyWebView mwv = (MyWebView) findViewById(R.id.mwv); 
    registerForContextMenu(mwv); 
} 

public boolean onLongClick(View v) { 
    openContextMenu(v); 
    return true; 
} 

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
        ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context, menu); 
} 
+2

Dzięki temu menu kontekstowe działa. Jednak nie mogę już przewijać widoku strony. W rzeczywistości każdy dotyk wyświetli menu kontekstowe. Masz pomysł, jak sprawić, by działał on perwersyjnie? – newman

+1

To samo tutaj, przeglądanie stron internetowych traci zdolność przewijania. – KingFu

+0

Myślę, że to dlatego, że nadpisałeś onTouchEvent, ale nie masz implementacji nadklasy. @Override public boolean onTouchEvent (zdarzenie MotionEvent) { if (gestureDetector.onTouchEvent (event)) return true; return super.onTouchEvent (zdarzenie); } Podany kod powinien wystarczyć :) –

0

zauważyłem, że długo wciskając niczego w emulatorze wymaga dużo naciskając, jak 5-7 sekund w przeciwieństwie do zwykłego 1-2 w rzeczywistości. Upewnij się, że naciskasz przez co najmniej 10 sekund, w przeciwnym razie wydaje się, że nic się nie dzieje.

2

Zamiast uzyskiwać dostęp do aktywności z widoku, polecam używanie interfejsu w widoku i wdrażanie tego interfejsu z poziomu aktywności użytkownika.

public class MyWebView extends WebView { 
    private OnLongPressListener mListener; 

    public MyWebView(Context context, AttributeSet attributes) { 
     mListener = (OnLongPressListener) context; 
    } 

    public void onLongPress(MotionEvent event) { 
     mListener.onLongPress(your variables); 
    } 

    public interface OnLongPressListener { 
     public void onLongPress(your variables); 
    } 
} 

public class YourActivity extends Activity implements OnLongPressListener { 

    @Override 
    public void onLongPress(your variables) { 
     // handle the longPress in your activity here: 
    } 
} 
+0

Możesz też wywołać zdarzenie, używając czegoś takiego jak EventBus. –

Powiązane problemy