9

Ho una Galleria, che ha un OnItemSelectedListener e un OnItemClickListener. Quindi posso spostarmi tra le immagini, e se clicco su una, succede qualcos'altro (dipende da quale ho fatto clic). Ha funzionato bene prima della versione 3.0, ma da lì (3,0-4,0) dopo che gestisce l'evento onItemClick, un errore irreversibile si verifica:Gallery onItemClick e onTouchEvent non funzionano insieme da Android versione 3.0

12-07 18:46:03.008: E/AndroidRuntime(935): FATAL EXCEPTION: main 
12-07 18:46:03.008: E/AndroidRuntime(935): java.lang.NullPointerException 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.GestureDetector.onTouchEvent(GestureDetector.java:587) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.widget.Gallery.onTouchEvent(Gallery.java:937) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.View.dispatchTouchEvent(View.java:5462) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1947) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1708) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1882) 
12-07 18:46:03.008: E/AndroidRuntime(935): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1361) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.app.Activity.dispatchTouchEvent(Activity.java:2364) 
12-07 18:46:03.008: E/AndroidRuntime(935): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1830) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.View.dispatchPointerEvent(View.java:5638) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2827) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2406) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.os.Looper.loop(Looper.java:137) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.app.ActivityThread.main(ActivityThread.java:4340) 
12-07 18:46:03.008: E/AndroidRuntime(935): at java.lang.reflect.Method.invokeNative(Native Method) 
12-07 18:46:03.008: E/AndroidRuntime(935): at java.lang.reflect.Method.invoke(Method.java:511) 
12-07 18:46:03.008: E/AndroidRuntime(935): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
12-07 18:46:03.008: E/AndroidRuntime(935): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
12-07 18:46:03.008: E/AndroidRuntime(935): at dalvik.system.NativeStart.main(Native Method) 
+1

Posso confermare che questo problema si verifica non solo per 'Gallery' ma anche per' ImageView'. Il colpevole sembra essere il 'VelocityTracker' all'interno della vista. –

risposta

10

Ho avuto lo stesso problema. Stavo iniziando un'attività da onItemClick e si stava bloccando l'app.

Il problema, penso, è cercare di fare qualcosa che dovrebbe essere fatto solo sul thread principale (come avviare un'attività).

Ho implementato un "gestore" e funziona perfettamente.

creare un gestore come una variabile globale:

private Handler handler; 

Impostare il gestore all'interno onCreate quindi è sul thread principale:

handler = new Handler(); 

creare un post al gestore in onItemClick, sguardi miniera così:

handler.post(new Runnable() { 

    @Override 
    public void run() { 
     // Do what ever... 
    } 
}); 
+1

Non capisco. Se il problema era "qualcosa che dovrebbe essere fatto solo sul thread principale", non dovrebbe apparire l'errore in quel "qualcosa"? Il modo in cui vedo la traccia dello stack, l'errore appare in 'GestureDetector.java: 587', vale a dire (guardando la fonte): ' mVelocityTracker.recycle(); ' Ciò significa che' mVelocityTracker' è in questo caso 'null '. Come si deduce da ciò che questo è un problema di thread? –

+0

Grazie Valer Dragos per la bella soluzione +10 –

+0

stesso dal mio lato –

0

Ho anche ottenuto NPE in onTouchEvent(): 587. Così ho iniziato a usare GestureDetectorCompat dalla libreria di supporto e funziona perfettamente.

Problemi correlati