1

有谁知道我可以捕获长按以及单击首选项片段中的首选项的方法?

具体来说,我有一个扩展 DialogPreference 的类,我希望它根据是单击还是长按打开不同的对话框。

我已经尝试实现这一点已有一段时间了,但似乎无法使其与偏好片段一起使用。 如何将“长按监听器”添加到首选项?

谢谢!

4

2 回答 2

2

在嵌套首选项屏幕的情况下,我很难完成这项工作。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);
    }
}

当然,如果您有多个偏好这样做,您将一遍又一遍地设置侦听器。如果需要,您可以添加一些检查以防止这种情况发生。

于 2015-12-08T22:37:21.953 回答
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;
    }

...

}

设置.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>
于 2013-11-26T15:42:58.360 回答