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