Android 如何将GestureDetector附加到ListPreference?

Android 如何将GestureDetector附加到ListPreference?,android,listpreference,gesturedetector,Android,Listpreference,Gesturedetector,将a连接到a的挑战有两个方面: 获取仅在preferences.xml中定义的ListPreference的句柄(即未在Java代码中实例化) ListPreference既不是视图也不是活动子类 是否有可能将a连接到a 如果是这样的话,人们会怎么做呢?我将在何处编写代码来实例化GestureDetector并实现侦听器?我以前使用setOnTouchListener将GestureDetector设置为滚动视图,并搜索ListPreference的类似方法,但由于ListPreference不

将a连接到a的挑战有两个方面:

  • 获取仅在preferences.xml中定义的ListPreference的句柄(即未在Java代码中实例化)
  • ListPreference既不是视图也不是活动子类 是否有可能将a连接到a


    如果是这样的话,人们会怎么做呢?我将在何处编写代码来实例化GestureDetector并实现侦听器?

    我以前使用
    setOnTouchListener将GestureDetector设置为滚动视图,并搜索ListPreference的类似方法,但由于ListPreference不包含此类方法,我认为这是不可能的。

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

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

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

    建议这样做的方法是


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

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

    在其中一条评论中,您指出,在这个阶段,您感兴趣的只是检测列表中任何项目的长按。因此,我不会通过附加一个
    手势检测器
    来回答这个问题,而是简单地使用一个
    长点击监听器

    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;
        }
    
    }
    
    公共类ListPreferenceActivity扩展PreferenceActivity在PreferenceClickListener上实现{
    私有列表优先权和引用;
    @在创建时覆盖受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.list\u prefs);
    mListPreference=(ListPreference)FindReference(“pref_列表”);
    mListPreference.setOnPreferenceClickListener(此);
    }
    @凌驾
    公共布尔值打开首选项单击(首选项){
    AlertDialog=(AlertDialog)mListPreference.getDialog();
    dialog.getListView().setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener()){
    @重写公共布尔值长单击(AdapterView父对象、视图v、整型位置、长id){
    Toast.makeText(getApplicationContext(),“长时间单击索引”+position+”:“
    +parent.getItemAtPosition(position.toString(),Toast.LENGTH_SHORT.show();
    返回false;
    }
    });
    返回false;
    }
    }
    
    结果(toast在长时间单击中显示):


    通过引用
    列表视图
    ,您还可以在TouchListener上附加一个
    GestureDetector
    等。由您决定从这里开始。

    您能告诉我此实现的主要目标是什么吗?预期结果是什么,以及
    GestureDetector
    将用于什么?@g00dy此时,我只想从它检测列表中任何项目的长按吗(当然,返回长按项目的索引)。这里的挑战的关键是,
    ListPreference
    是一个视图,但它不是在布局XML中定义的,因此不能通过访问。或者可以吗?我开始认为唯一的解决方法是定义并使用ListPreference的子类,然后在其
    onCreate()
    中对其进行访问。您可能可以执行
    getView().setOnTouchListener()
    。但不确定具体如何。是的,您正确地回答了问题。:-+1,接受并奖励奖金。现在。。。是否有可能对
    (AlertDialog)
    的强制转换在某些Android版本/flavor/distro/customization中不起作用?@scatmoi:强制转换对于从
    DialogPreference
    扩展的任何内容都应该是安全的,因为这强制其扩展类使用
    onPrepareDialogBuilder构建
    对话框(AlertDialog.Builder)
    。我快速查看了一下,
    ListPreference
    通过合同至少将其删除到Android 1.5(Cupcake)。事实上,
    ListPreference
    多年来几乎没有变化……总之,为了保持理智,在演员阵容之前添加一个
    实例检查也不会有什么坏处你的方法可能行得通,但太麻烦了@MH的方法更加优雅(但我不知道它是否能保证与未来的Android版本兼容)。