The challenge of attaching a GestureDetector to a ListPreference is 2-fold:
- Getting a handle to a ListPreference that's only defined in a preferences.xml (i.e. not instantiated in Java code).
- ListPreference is neither a View nor Activity subclass.
Is it possible at all to attach a GestureDetector to a ListPreference?
If so, how would one go about this? Where would I write the code to instantiate GestureDetector and implement the listener?
I have set a GestrueDetector to a ScrollView using
setOnTouchListener
previously and searched for a similar method for ListPreference, however since the ListPreference does not contain such a method, I do not believe this will be possible.Unless I didn't quite catch the question correctly, the answer is probably simpler than you might think. The source code for
ListPreferece
teaches that it's little more than a wrapper around anAlertDialog
that displays its various options in aListView
. Now,AlertDialog
actually allows you to get a handle on theListView
it wraps, which is probably all you need.In one of the comments you indicated that, at this stage, all you're interested in is detecting a long-press on any item in the list. So rather than answering that by attaching a
GestureDetector
, I'll simply use anOnItemLongClickListener
.The result (which the toast in the long-click displaying):
With a reference to the
ListView
, you could also attach anOnTouchListener
,GestureDetector
etc. Up to you to go from here.As @TronicZomB suggested, this isn't directly possible.
You can work around this by creating your own ListPreference derived class, getting its view in the inherited onBindDialogView().
Remember however that the latter is tricky because onBindDialogView() is only called if onCreateDialogView() doesn't return null, and this can happen only if you create your own custom view for YourListPreference.
The recommended way to do this is to build a custom Preference.
Once you have done that, you have a reference to YourListPreference's view, which is mandatory for attaching GestureDetector because one of the steps requires setOnTouchListener() on the view.