近期在开发项目中,碰到一个小小的技术难题。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配置项对长按事件进行相应的需求。