(一)开发上下文菜单的步骤:
1、重写
onCreateContextMenu
(ContextMenu menu, View v,ContextMenuInfo menuInfo)方法;
2、调用Activity的 registerForContextMenu (View view)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户 长按该控件 后显示上下文菜单)。
3、为菜单项提供响应,重写 onContextItemSelected (MenuItem item)。
2、调用Activity的 registerForContextMenu (View view)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户 长按该控件 后显示上下文菜单)。
3、为菜单项提供响应,重写 onContextItemSelected (MenuItem item)。
(二)、ContextMenu的用法:
1、
ContextMenuInfo 有什么用呢?
- 当视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的id等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。
- API中的官方解释:Additional information regarding the creation of the context menu. For example, AdapterViews use this to pass the exact item position within the adapter that initiated the context menu.
- ContextMenuInfo携带了注册上下文菜单控件的一些额外信息。一般用在AdaterViews(例如:ListView或GridView)上,可以在ContextMenuInfo 中获取到适配器View中的position的信息。
2、核心代码:
- AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
- int id = info.id;
- int position = info.position;
二、示例代码:
public class MainActivity extends Activity {
private final static String TAG = "MainActivity";
private TextView textView_main_emptyinfo;
private EditText editText_main_phone;
private ListView listView_main_blocklist;
private ArrayAdapter<String> adapter = null;
private SharedPreferences prefs = null;
private SharedPreferences.Editor editor = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView_main_emptyinfo = (TextView) findViewById(R.id.text_main_emptyinfo);
editText_main_phone = (EditText) findViewById(R.id.editText_main_phone);
listView_main_blocklist = (ListView) findViewById(R.id.listView_main_blocklist);
prefs = getSharedPreferences("blocklist", Context.MODE_PRIVATE);
editor = prefs.edit();
// 在ListView组件上注册长按弹出上下文菜单的功能
registerForContextMenu(listView_main_blocklist);
List<String> list = getBlockList();
if (list != null) {
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, list);
// 注意setEmptyView()的用法。
// 当适配器为空的时候,设置ListView中的展示内容。
// 要放置在适配器生成之后
listView_main_blocklist.setEmptyView(textView_main_emptyinfo);
listView_main_blocklist.setAdapter(adapter);
}
}
public void clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_add:
// 将文本编辑框中的手机号码信息写入到SharedPreferences文件
editor.putString(editText_main_phone.getText().toString(), null);
editor.commit();
// 填充适配器
fillListView();
break;
case R.id.button_main_clear:
editor.clear();
editor.commit();
fillListView();
break;
default:
break;
}
}
// 创建上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
// Log.i(TAG, "==info1_id:" + info.id + "==info1_position:" +
// info.position);
menu.setHeaderTitle("提示:" + getBlockList().get(info.position));
menu.setHeaderIcon(R.drawable.search);
getMenuInflater().inflate(R.menu.contextmenu_listview_main, menu);
}
// 上下文菜单被选中后的回调方法
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
// Log.i(TAG, "==info2:" + info.position);
switch (item.getItemId()) {
case R.id.menu_item_delete:
editor.remove(getBlockList().get(info.position));
editor.commit();
fillListView();
break;
case R.id.menu_item_donothing:
break;
}
return super.onContextItemSelected(item);
}
/*
* 获取SharedPreferences中的全部数据,放到List集合中。形成适配器的数据源
*/
private List<String> getBlockList() {
List<String> list = new ArrayList<String>();
Map<String, ?> map = prefs.getAll();
// 增强for循环,实现对Map集合的遍历
for (Map.Entry<String, ?> entry : map.entrySet()) {
list.add(entry.getKey());
}
return list;
}
/*
* ListView适配器的数据源更新,实现刷新显示数据的效果
*/
public void fillListView() {
adapter.clear();
adapter.addAll(getBlockList());
}
}