有谁知道我可以捕获长按以及单击首选项片段中的首选项的方法?
具体来说,我有一个扩展 DialogPreference 的类,我希望它根据是单击还是长按打开不同的对话框。
我已经尝试实现这一点已有一段时间了,但似乎无法使其与偏好片段一起使用。 如何将“长按监听器”添加到首选项?
谢谢!
有谁知道我可以捕获长按以及单击首选项片段中的首选项的方法?
具体来说,我有一个扩展 DialogPreference 的类,我希望它根据是单击还是长按打开不同的对话框。
我已经尝试实现这一点已有一段时间了,但似乎无法使其与偏好片段一起使用。 如何将“长按监听器”添加到首选项?
谢谢!
在嵌套首选项屏幕的情况下,我很难完成这项工作。Fragment本身看到的ListView只是最顶层的列表。当您打开子屏幕时,实际上您会弹出一个对话框。这是有问题的,因为 (1) PreferenceScreen 是最终的,并且 (2) 在单击项目之前对话框不存在,并且由于 (1) 很难或不可能从片段中获取对话框。
我解决它的方式有点像 hack,但我想,“如果我无法从层次结构的上方获取 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);
}
}
当然,如果您有多个偏好这样做,您将一遍又一遍地设置侦听器。如果需要,您可以添加一些检查以防止这种情况发生。
将 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;
}
...
}
设置.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>