如何将GestureDetector附加到ListPreference?

将GestureDetector附加到ListPreference的挑战是双重的:

  1. 获取仅在preferences.xml中定义的ListPreference句柄(即未在Java代码中实例化)。
  2. ListPreference既不是View子类也不是Activity子类。

是否可以将GestureDetector附加到ListPreference ?

如果是这样,怎么会这样呢? 我会在哪里编写代码来实例化GestureDetector并实现监听器?

除非我没有正确地理解问题,否则答案可能比你想象的要简单。 ListPreferece的源代码教导它只是一个AlertDialog的包装器,它在ListView中显示它的各种选项。 现在, AlertDialog实际上允许您获取它包装的ListView的句柄,这可能就是您所需要的。

在其中一条评论中,您表示,在此阶段,您感兴趣的只是检测列表中任何项目的长按。 因此,我只需使用GestureDetector ,而不是通过附加GestureDetector回答这个OnItemLongClickListener

 public class ListPreferenceActivity extends PreferenceActivity implements OnPreferenceClickListener { private ListPreference mListPreference; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.list_prefs); mListPreference = (ListPreference) findPreference("pref_list"); mListPreference.setOnPreferenceClickListener(this); } @Override public boolean onPreferenceClick(Preference preference) { AlertDialog dialog = (AlertDialog) mListPreference.getDialog(); dialog.getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView parent, View v, int position, long id) { Toast.makeText(getApplicationContext(), "Long click on index " + position + ": " + parent.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show(); return false; } }); return false; } } 

结果(在长按显示中吐司):

在此处输入图像描述

通过对ListView的引用,您还可以附加一个OnTouchListenerGestureDetector等。由您决定从这里开始。

正如@TronicZomB建议的那样,这不可能直接实现。

您可以通过创建自己的ListPreference派生类,在inheritance的onBindDialogView()中获取其视图来解决此问题。

但请记住,后者是棘手的,因为仅当onCreateDialogView()不返回null时才调用onBindDialogView(),并且只有在为YourListPreference创建自己的自定义视图时才会发生这种情况。

建议的方法是构建自定义首选项 。

完成后,您将引用YourListPreference的视图,这对于附加GestureDetector是必需的,因为其中一个步骤需要视图上的setOnTouchListener()。

我先前使用setOnTouchListener将GestrueDetector设置为ScrollView,并为setOnTouchListener搜索了类似的方法,但由于ListPreference不包含这样的方法,我不相信这是可能的。