如何将GestureDetector附加到ListPreference?

7
GestureDetector附加到ListPreference的挑战有两个方面:
  1. 获取仅在preferences.xml中定义(即未在Java代码中实例化)的ListPreference的句柄。
  2. ListPreference既不是View子类也不是Activity子类。
是否可能将GestureDetector附加到ListPreference
如果可以,请问应该如何操作?在哪里编写代码来实例化GestureDetector并实现监听器?

2
请问这个实现的主要目标是什么 - 期望的结果是什么,GestureDetector 将用于什么? - g00dy
@g00dy 目前我想要的只是检测列表中任何项目的长按操作(当然也要返回被长按的项目的索引)。 - scatmoi
3个回答

4
除非我没有正确理解问题,否则答案可能比你想象的更简单。 ListPreferece 的源代码表明它只是一个围绕 AlertDialog 的包装器,该包装器在 ListView 中显示其各种选项。 现在,AlertDialog 实际上允许您获取其包装的 ListView 的句柄,这可能是您所需的全部。
在其中一条评论中,您指出目前只对在列表中长按任何项目进行检测感兴趣。 因此,我将不会使用 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;
    }

}

结果 (在长按时显示的提示框中):

enter image description here

如果你有关于 ListView 的参考,你也可以附加一个 OnTouchListener, GestureDetector 等等。从这里开始是由你决定。


是的,你正确地理解了这个问题。 :-) +1,接受并奖励额外的奖金。现在...有没有可能在某些Android版本/口味/发行版/定制中,将(AlertDialog)转换不起作用? - scatmoi
@scatmoi:如果继承自DialogPreference,那么强制要求使用onPrepareDialogBuilder(AlertDialog.Builder builder)构建Dialog的扩展类应该是安全的。我快速查看了一下,ListPreference至少从Android 1.5(Cupcake)开始就已经遵守了这个约定。事实上,ListPreference在多年间几乎没有改变过... 无论如何,为了保险起见,在进行转换之前添加一个instanceof检查也不会有什么坏处。 :) - MH.

1

正如@TronicZomB所建议的那样,这并非直接实现。

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

但是要记住,后者很棘手,因为只有在onCreateDialogView()不返回null时才会调用onBindDialogView(),而这只能在为YourListPreference创建自定义视图时发生。

建议的方法是构建自定义Preference

完成后,您就有了对YourListPreference视图的引用,这是附加GestureDetector所必需的,因为其中一步需要在视图上设置setOnTouchListener()。


你的方法可能可行,但是太繁琐了。@MH. 的方法更加优雅(但我不知道它是否保证与未来的Android版本兼容)。 - scatmoi

0
我之前使用了 setOnTouchListener 将 GestrueDetector 设置到了 ScrollView 上,并且搜索了类似于 ListPreference 的方法,但是由于 ListPreference 没有包含这样的方法,所以我不认为这是可能的。

2
这里的挑战关键在于 ListPreference 一个视图,但它并没有在布局XML中定义,因此不能通过 findViewById() 访问。或者它可以吗?我开始觉得唯一的解决方法是定义和使用 ListPreference 的子类,然后在其 onCreate() 中使用 setOnTouchListener() - scatmoi
你可能可以使用 getView().setOnTouchListener()。但具体怎么做不太确定。 - TronicZomB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接