7

The challenge of attaching a GestureDetector to a ListPreference is 2-fold:

  1. Getting a handle to a ListPreference that's only defined in a preferences.xml (i.e. not instantiated in Java code).
  2. 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?

4

3 回答 3

4

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

在您指出的其中一条评论中,在此阶段,您感兴趣的只是检测对列表中任何项目的长按。GestureDetector因此,我不会通过附加 a 来回答这个问题,而是简单地使用一个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。您可以从这里开始。

于 2013-06-27T19:34:21.340 回答
1

正如@TronicZomB 建议的那样,这是不可能的。

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

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

推荐的方法是构建一个自定义 Preference

完成此操作后,您将获得对 YourListPreference 视图的引用,这是附加 GestureDetector 所必需的,因为其中一个步骤需要在视图上设置 setOnTouchListener()。

于 2013-06-27T12:11:04.010 回答
0

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.

于 2013-06-21T13:28:35.743 回答