Android Preference 实现长按监听 long-clickable

近期在开发项目中,碰到一个小小的技术难题。UI要求在settings配置项中实现部分配置项的动态添加、编辑以及删除。因此需要实现Preference长按弹出上下文菜单,再选择编辑或者删除。Preference是Android传为settings界面准备的组件,定制度较高,没有提供长按或者是注册上下文监听的监听函数,调研一段时间之后,在stackoverflow上找到一个可行方案,在此记录。

 

Preference实现了onClick()方法,但没有方法用来接收onLongClick()事件。事实上,PreferenceActivity是一个ListActivity,因此我们可以通过ListActivity的getListView()或者每一个View。直接对每一个View注册上下文菜单的话,会使所有Preference配置项长按都会弹出上下文菜单,不符合我们的需求(我们的项目中,部分配置项是写死的,部分是需要用户定制的),因此采用如下方案:

 1 public class TestActivity extends PreferenceActivity {
 2     @Override
 3     protected void onCreate(Bundle savedInstanceState) {
 4 
 5         super.onCreate(savedInstanceState);
 6 
 7         addPreferencesFromResource(R.xml.account_options_prefs);
 8 
 9         ListView listView = getListView();
10         listView.setOnItemLongClickListener(new OnItemLongClickListener() {
11             @Override
12             public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
13                 ListView listView = (ListView) parent;
14                 ListAdapter listAdapter = listView.getAdapter();
15                 Object obj = listAdapter.getItem(position);
16                 if (obj != null && obj instanceof View.OnLongClickListener) {
17                     View.OnLongClickListener longListener = (View.OnLongClickListener) obj;
18                     return longListener.onLongClick(view);
19                 }
20                 return false;
21             }
22         });
23     }
24 }

关键代码见标红的部分。

 

之后建立继承Preference的新类,凡是实现了View.OnLongClickListener 接口的类,都可以对长按进行响应,代码如下:

1 public class TestPreference extends CheckBoxPreference implements View.OnLongClickListener {
2 
3     @Override
4     public boolean onLongClick(View v) {
5         // Do something for long click
6         return true;
7     }
8 }

如此,即可实现部分Preference配置项对长按事件进行相应的需求。

转载于:https://www.cnblogs.com/xutao1988/archive/2012/05/05/2484730.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值