2011-02-03 10 views
5

Attualmente sto cercando di ottenere una visualizzazione Web personalizzata che visualizza un ContextMenu quando viene premuto per un tempo più lungo. Come la classe predefinita WebView visualizza solo un ContextMenu quando un link viene longPressed, ho scritto la mia classe per ignorare questo comportamento:Android: apertura di un menu contestuale da onLongPress in WebView personalizzata

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 
     } 
    }; 
} 

Questo funziona senza problemi la longpress viene rilevato e il metodo onLongPress viene chiamato, comunque sto in perdita quando si tratta di visualizzare il ContextMenu. Ho provato a farlo nel solito modo nella mia attività:

@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); 
} 

Tuttavia, quando ho longpress il MyWebView nell'emulatore, non accade nulla. Cosa devo chiamare da onLongPress() per visualizzare ContextMenu?

risposta

1

Chiama Activity.openContextMenu (Visualizza v) in onLongPress. Ciò significherebbe che il MyWebView manterrà comunque un riferimento all'attività.

3

Ho funzionato ora, basandosi sul suggerimento di gngr44. Ho fatto in modo che la mia attività implementasse la classe OnLongClickListener e fornisse un metodo onLongClick() che apre il menu di scelta rapida.

Il codice rivisto:

Il WebView personalizzato:

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); 
     } 
    }; 
} 

La mia attività:

@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

Questo rende il menu di scelta rapida. Tuttavia, non riesco più a scorrere la visualizzazione Web. In realtà, qualsiasi tocco farà apparire il menu contestuale. Qualche idea su come farlo funzionare per sempre? – newman

+1

Lo stesso qui, la webview perde la sua capacità di scorrimento – KingFu

+0

Penso che sia perché hai sovrascritto l'onTouchEvent ma non hai implementato la superclasse. @Override public booleano onTouchEvent (evento MotionEvent) { if (gestureDetector.onTouchEvent (evento)) return true; return super.onTouchEvent (evento); } Il codice indicato dovrebbe fare il trucco :) –

0

ho notato che la pressione lunga qualsiasi cosa nell'emulatore richiede un sacco di premendo, come 5-7 secondi rispetto a un normale 1-2 nella vita reale. Assicurati di premere per almeno 10 secondi, altrimenti sembrerebbe che non succeda nulla.

2

Invece di accedere all'attività dal proprio punto di vista, raccomanderei l'uso di un'interfaccia nella vista e l'implementazione dell'interfaccia dalla propria attività.

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

Oppure attivare un evento utilizzando qualcosa come EventBus. –