长按一个偏好片段?

时间:2013-10-05 15:46:49

标签: android android-fragments

有没有人知道我可以捕捉长按,以及点击偏好片段中的偏好?

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

我一直试图实现这一段时间,似乎无法使其与偏好片段一起使用。 How to add a "long click listener" to a Preference?

谢谢!

2 个答案:

答案 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>