如何添加“长点击侦听器"偏好? [英] How to add a "long click listener" to a Preference?

查看:71
本文介绍了如何添加“长点击侦听器"偏好?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 PreferenceActivity ,我想在其中动态添加首选项.

I have an PreferenceActivity where I would like to add Preferences dynamically.

长按时,这些操作会起作用,但是 OnPreferenceClickListener 仅支持常规点击,不支持长按.

On a long click, these shall do something, however OnPreferenceClickListener only supports normal clicks, no long clicks.

有没有实现此功能的方法,我错过了什么吗?

Is there a way to implement this feature, did I miss something?

谢谢

推荐答案

如果链接消失,以下是该链接上帖子的主体.注意:我在下方未编写任何内容.

内置的Preference类具有一种用于接收点击的方法onClick,但是没有一种用于接收长时间点击的方法.在我当前的项目中,我实际上对此有需求,并找到了实现它的方法.

The built-in Preference class has a method to receive clicks, onClick, but no method to receive long clicks. In my current project, I actually have a need for this, and found a way to implement it.

PreferenceActivity实际上是一个ListActivity,在幕后有一个特殊的适配器.使用常规ListView机制setOnItemClickListener处理常规(不长)单击.设置此代码的代码在PreferenceScreen中:

PreferenceActivity is actually a ListActivity, with a special adapter behind the scenes. The usual (not long) clicks are processed by using the usual ListView mechanism, setOnItemClickListener. The code to set this up is in PreferenceScreen:

public final class PreferenceScreen extends PreferenceGroup implements AdapterView.OnItemClickListener.... {
    public void bind(ListView listView) {
        listView.setOnItemClickListener(this);
        listView.setAdapter(getRootAdapter());

        onAttachedToActivity();
    }

    public void onItemClick(AdapterView parent, View view, int position, long id) {
        Object item = getRootAdapter().getItem(position);
        if (!(item instanceof Preference)) return;
                     
        final Preference preference = (Preference) item;
        preference.performClick(this);
    }
}

将PreferenceScreen子类化并覆盖绑定以向列表视图添加长按侦听器是很容易的,除非该类是最终类.因此,我最终将以下代码添加到我的PreferenceActivity子类中:

It would be really easy to subclass PreferenceScreen and override bind to add a long-item-click listener to the list view, except this class is final. Because of this, I ended up adding the following code into my PreferenceActivity subclass:

public class BlahBlahActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
 
        addPreferencesFromResource(R.xml.account_options_prefs);
 
        ListView listView = getListView();
        listView.setOnItemLongClickListener(new 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;
            }
        });
    }
}

现在,我可以拥有一个实现View.OnLongClickListener的Preference子类,该类会自动被长按:

Now I can have a Preference subclass that implements View.OnLongClickListener, which is automatically invoked for long clicks:

public class BlahBlahPreference extends CheckBoxPreference implements View.OnLongClickListener {
    @Override
    public boolean onLongClick(View v) {
        // Do something for long click
        return true;
    }
}

这篇关于如何添加“长点击侦听器"偏好?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆