有没有人知道我可以捕捉长按,以及点击偏好片段中的偏好?
具体来说,我有一个扩展DialogPreference的类,我希望它根据是Clicked还是Long Tapped打开一个不同的对话框。
我一直试图实现这一段时间,似乎无法使其与偏好片段一起使用。 How to add a "long click listener" to a Preference?
谢谢!
答案 0 :(得分:2)
在嵌套首选项屏幕的情况下,我很难完成这项工作。片段本身看到的ListView只是顶级列表。当你打开一个子屏幕时,你真的会弹出一个对话框。这是有问题的,因为(1)PreferenceScreen是最终的,并且(2)在单击项目之前对话框不存在,并且由于(1)而很难或不可能从片段中获取对话框。
我解决它的方式有点像黑客,但我想,“如果我不能从层次结构中的上面获取listView,我可以从下面获取它。”我的PreferenceScreen恰好充满了自定义首选项的实例。由于Preference显然不是最终的,我们可以利用这样一个事实:当Preference的视图被创建时,PreferenceScreen肯定存在。您可以非常轻松地访问它并应用Kostya的方法。
public class MyEditTextPreference extends EditTextPreference {
@Override
protected View onCreateView(ViewGroup parent) {
ListView listView = (ListView)parent;
listView.setOnItemLongClickListener(new ListView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
ListView listView = (ListView) parent;
ListAdapter listAdapter = listView.getAdapter();
Object obj = listAdapter.getItem(position);
if (obj != null && obj instanceof View.OnLongClickListener) {
View.OnLongClickListener longListener = (View.OnLongClickListener) obj;
return longListener.onLongClick(view);
}
return false;
}
});
return super.onCreateView(parent);
}
}
当然,如果您有多个首选项,那么您将一遍又一遍地设置监听器。如果需要,您可以添加一些检查以防止这种情况。
答案 1 :(得分:0)
将onCreateView()添加到PreferenceFragment类:
public class MyPreferenceFragment extends PreferenceFragment implements OnItemLongClickListener {
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d("TAG", "onCreateView");
View view = inflater.inflate(R.layout.settings, container, false);
ListView listView = (ListView) view.findViewById(android.R.id.list);
listView.setOnItemLongClickListener(this);
return view;
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("TAG", "onItemLongClick");
ListView listView = (ListView) parent;
ListAdapter listAdapter = listView.getAdapter();
Object obj = listAdapter.getItem(position);
if (obj != null && obj instanceof View.OnLongClickListener) {
View.OnLongClickListener longListener = (View.OnLongClickListener) obj;
return longListener.onLongClick(view);
} else {
Preference pref = (Preference) obj;
...
}
return true;
}
...
}
的settings.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>