Android-上下文菜单Menu
上一篇博客介绍了,Android-普通菜单Menu,而这篇博客介绍Android-上下文菜单Menu
AndroidManifest.xml 中加入权限:
<!-- 读取联系人数据的权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/> <!-- 读取通话记录的全身 -->
<uses-permission android:name="android.permission.READ_CALL_LOG" /> <!-- 修改通话记录的权限 -->
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
Activity
package liudeli.activity; import android.app.Activity;
import android.content.ClipboardManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.TextView; public class ContentMenuActivity extends Activity { private static final int MENU_ITEM_COPY_TO_DIALER = Menu.FIRST;
private static final int MENU_ITEM_SEND_SMS = Menu.FIRST + 1;
private static final int MENU_ITEM_COPY_TO_CLIPBOARD = Menu.FIRST + 2;
private CursorAdapter adapter; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content_menu); // 初始化控件
ListView lv = findViewById(R.id.lv); // 获取通话记录的数据
ContentResolver cr = getContentResolver();
Uri uri = CallLog.Calls.CONTENT_URI;
String[] projection = new String[]{CallLog.Calls._ID,
CallLog.Calls.CACHED_NAME,
CallLog.Calls.NUMBER,
CallLog.Calls.TYPE}; Cursor cursor = cr.query(uri, projection, null, null, null);
adapter = new MyAdapter(this, cursor);
lv.setAdapter(adapter); /**
* 1 给listview注册上下文菜单
*/
registerForContextMenu(lv);
} /**
* 2 创建上下文菜单
* @param menu
* @param v
* @param menuInfo
*/
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
menu.add(0, MENU_ITEM_COPY_TO_DIALER, 0, "复制号码到拨号盘");
menu.add(0, MENU_ITEM_SEND_SMS, 0, "发送短信");
menu.add(0, MENU_ITEM_COPY_TO_CLIPBOARD, 0, "复制号码到粘贴板");
super.onCreateContextMenu(menu, v, menuInfo);
} /**
* 3 处理上下文菜单的点击事件
* @param item
* @return
*/
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int position = acmi.position;
Cursor cursor = (Cursor) adapter.getItem(position);
String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
Intent intent;
int id = item.getItemId();
switch (id) {
case MENU_ITEM_COPY_TO_DIALER:
//激活拨号盘的组件,并且把号码传递过去
intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:"+number));
startActivity(intent);
break;
case MENU_ITEM_SEND_SMS:
intent = new Intent();
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:"+number));
startActivity(intent);
break;
case MENU_ITEM_COPY_TO_CLIPBOARD:
//剪贴板是一个系统服务
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
//复制数据
clipboardManager.setText(number);
break; default:
break;
} return super.onContextItemSelected(item);
} private class MyAdapter extends CursorAdapter { private LayoutInflater mInflater; public MyAdapter(Context context, Cursor c) {
super(context, c);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
} @Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = mInflater.inflate(R.layout.lv_item, null);
return view;
} @Override
public void bindView(View view, Context context, Cursor cursor) {
// 得到控件
TextView tv_name = view.findViewById(R.id.tv_name);
TextView tv_number = view.findViewById(R.id.tv_number);
TextView tv_type = view.findViewById(R.id.tv_type); // 得到数据
String name = cursor.getString(1);
String number = cursor.getString(2);
int type = cursor.getInt(3); // 绑定数据
if(name == null){
tv_name.setText("未知");
}else{
tv_name.setText(name);
} tv_number.setText(number); switch (type) {
case CallLog.Calls.INCOMING_TYPE:
tv_type.setText("来电");
break;
case CallLog.Calls.OUTGOING_TYPE:
tv_type.setText("拨号"); break;
case CallLog.Calls.MISSED_TYPE:
tv_type.setText("未接");
break; default:
break;
} } }
}
Activity的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ListView
android:id="@+id/lv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/> </LinearLayout>
适配器要使用的 item 布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" > <TextView
android:id="@+id/tv_name"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_number"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_type"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content" /> </LinearLayout>
效果:
Android-上下文菜单Menu的更多相关文章
- android上下文菜单
XML: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...
- Android 上下文菜单实现
1.覆盖Activity的onCreateContenxtMenu()方法,调用Menu的add方法添加菜单项(MenuItem). 2.覆盖Activity的onContextItemSelecte ...
- android 上下文菜单详解
本文使用xml来创建上下文菜单 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:andr ...
- Android上下文菜单ContentView详解
ContentView介绍 上下文菜单继承了android.view.Menu,因此我们可以像操作Options Menu那样给上下文菜单增加菜单项.上下文菜单与Options Menu最大的不同在于 ...
- Android 上下文菜单 ContextMenu
public class MainActivity extends Activity { private ListView listView; @Override protected void onC ...
- Android 上下文菜单 ActionMode
public class MainActivity extends Activity { private Button button; private ActionMode actionMode; @ ...
- Android 上下文菜单 PopupMenu
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s ...
- 安卓开发_浅谈ContextMenu(上下文菜单)
长下文菜单,即长按view显示一个菜单栏 与OptionMenu的区别OptionMenu对应的是activity,一个activity只能拥有一个选项菜单ContextMenu对应的是View,每个 ...
- Android开发之Menu组件
菜单Menu大致分为三种类型:选项菜单(OptionsMenu),上下文菜单(ContextMenu),子菜单(SubMenu). 1.选项菜单 在一个Activity界面中点击手机Menu键,在屏幕 ...
- Android 的上下文菜单: Context Menu,registerForContextMenu(getListView())
概述: Android 的上下文菜单类似于 PC 上的右键菜单.当为一个视图注册了上下文菜单之后,长按(2 秒左右)这个视图对象就会弹出一个浮动菜单,即上下文菜单.任何视图都可以注册上下文菜单,不过, ...
随机推荐
- conductor APIs
任务和工作流元数据 端点 描述 输入 GET /metadata/taskdefs 获取所有任务定义 N / A GET /metadata/taskdefs/{taskType} 检索任务定义 任务 ...
- maven tomcat7 远程热部署
在maven项目开发中,一般推荐使用jetty进行开发调试.但是在项目发布的时候要求使用tomcat7作为发布服务器,为此在maven中配置了tomcat7插件,以支持项目在外部tomcat7进行远程 ...
- cmd命令 从C盘转到D盘
点开始 点运行.输入 CMD 回车.进入DOS提示符状态下.输入 cd\ 回车 表示进入 c:\> 也就是C盘根目录下.输入d: 回车 是进入D盘当前目录,并不一定是根目录.然后cd\ ...
- 每月IT摘录201808--201809
一.技术 海量数据的解决方案: 使用缓存: 页面静态化技术: 数据库优化: 分离数据库中活跃的数据: 批量读取和延迟修改: 读写分离: 使用NoSQL和Hadoop等技术: 分布式部署数据库: 应用服 ...
- x86汇编知识点汇总
目录: 1.进制转换 2.原码.反码.补码 3.寄存器 4.存储器的段结构 5.堆栈 6.传送类指令 7.算术运算类指令(不含乘除) 8.位操作类指令 9.标志位操作指令 10.标识符.常量与变量 1 ...
- [SCOI2007]修车(建图好题)
[SCOI2007]修车 https://www.lydsy.com/JudgeOnline/problem.php?id=1070 Time Limit: 1 Sec Memory Limit: ...
- java里的静态成员变量是放在了堆内存还是栈内存
转自http://bbs.csdn.NET/topics/370001490 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm ...
- 安全运维 -- Linux服务器使用公私钥密匙证书登录
环境:Ubuntu 16 前言 黑客遍地都是,ssh/pop3/ftp等爆破工具的流行让站长的日常运维工作量大大加重.Metasplot,Bruter等工具更是针对以上协议有专门 的破解方法,有字典破 ...
- mvcpager 表单提交时无法获取pageindex的值
1.将分布页包含到form中 2.在分布页中新增一个表单hidden元素,name为pageIndex(与控制器中的pageindex保持一尺),将后台获取到的pageindex值通过viewbag初 ...
- OpenSSL 结构体
X509_STORE 头文件:x509_vfy.h 定义 typedef struct x509_store_st X509_STORE; struct x509_store_st { /* The ...