有没有人知道一种方式,我可以捕获一个长期点击以及在偏好片段中的偏好点击?长按偏好片段?
具体来说,我有一个扩展DialogPreference类,我希望它打开一个不同的对话框,基于它是单击还是长按。
我一直在试图实施这个一段时间了,似乎无法使它与偏好片段一起工作。 How to add a "long click listener" to a Preference?
谢谢!
有没有人知道一种方式,我可以捕获一个长期点击以及在偏好片段中的偏好点击?长按偏好片段?
具体来说,我有一个扩展DialogPreference类,我希望它打开一个不同的对话框,基于它是单击还是长按。
我一直在试图实施这个一段时间了,似乎无法使它与偏好片段一起工作。 How to add a "long click listener" to a Preference?
谢谢!
添加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>
我有困难使得在嵌套优先选择屏幕的情况下,这项工作。由片段本身看到的ListView只是顶级列表。当你打开一个子屏幕时,你会弹出一个对话框。这是有问题的,因为(1)PreferenceScreen是最终的,并且(2)直到单击该项目时该对话框才存在,并且由于(1),从片段获得对话是困难的或不可能的。
我解决这个问题的方式有点破解,但我想,“如果我无法从层次结构中获取listView,我可以从下面获取它。”我的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);
}
}
当然,如果你有多个喜好这样做,你会不断设置监听器一遍又一遍。如果需要,您可以添加一些检查来防止这种情况发生。