如何在Preference中添加"长按侦听器"?

For*_*rce 4 android preferenceactivity android-preferences

我有一个PreferenceActivity我想动态添加首选项的地方.

长按一下,这些都可以做,但OnPreferenceClickListener只支持普通点击,不需要长时间点击.

有没有办法实现这个功能,我错过了什么?

谢谢

Mxy*_*xyk 11

看看这是否有帮助.


如果链接死亡,这里是该链接的帖子的主体.注意:我没有在下面创作任何内容.

内置的Preference类有一个接收点击的方法,onClick,但没有接收长点击的方法.在我目前的项目中,我实际上需要这个,并找到了实现它的方法.

PreferenceActivity实际上是一个ListActivity,在幕后有一个特殊的适配器.通常(不长)点击是使用通常的ListView机制setOnItemClickListener处理的.设置它的代码在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

继承PreferenceScreen并覆盖bind以将长项单击侦听器添加到列表视图将非常容易,除非此类是final.因此,我最终将以下代码添加到我的PreferenceActivity子类中:

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;
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以有一个实现View.OnLongClickListener的Preference子类,它会被长时间点击自动调用:

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