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>

效果:

原文地址:https://www.cnblogs.com/android-deli/p/10176701.html

时间: 2024-11-02 03:14:59

Android-上下文菜单Menu的相关文章

android 上下文菜单详解

本文使用xml来创建上下文菜单 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/add" android:title="添加" android:orderInCategor

Android 上下文菜单(Context Menu)

一.概述 Android中,上下文菜单是通过onLongClick(...)事件访问的.在事件触发后显示菜单项. 在使用上下文菜单时,通常在onCreate(...)方法中,先行注册上下文菜单.在实现onCreateContextMenu(...)方法和onContextItemSelected(...)方法. 注册菜单方法:registerForContextMenu(...) 注销注册菜单方法:unregisterForContextMenu(...) 二.使用XML文件添加上下文菜单 te

Android上下文菜单

package com.bawei.d4; import java.util.ArrayList;import java.util.List; import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuItem;import an

Android上下文菜单ContentView详解

ContentView介绍 上下文菜单继承了android.view.Menu,因此我们可以像操作Options Menu那样给上下文菜单增加菜单项.上下文菜单与Options Menu最大的不同在于,Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View.每个Activity有且只有一个Options Menu,它为整个Activity服务.而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们显示地通过 reg

Android 上下文菜单实现

1.覆盖Activity的onCreateContenxtMenu()方法,调用Menu的add方法添加菜单项(MenuItem). 2.覆盖Activity的onContextItemSelected()方法,响应上下文菜单菜单项的单击事件. 3.调用registerForContextMenu()方法,为视图注册上下文菜单. JAVA代码: packageEOE.local.contextMenu; importandroid.app.ListActivity; importandroid.

Android 上下文菜单 悬浮式

可以在每个View控件上注册一个长按点击事件,触发弹出一个悬浮的菜单,也成为上下文菜单 菜单视图部分 xml <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto&q

Android选项菜单和上下文菜单解析

选项菜单 创建选项菜单 Activity类的onCreateOptionMenu事件方法用来创建选项菜单,该方法定义如下: @Override public boolean onCreateOptionsMenu(Menu menu) { return super.onCreateOptionsMenu(menu); } 一般需要将创建选项菜单的代码放在onCreateOptionMenu方法中.通过Menu.add方法可以添加一个选项菜单.该 方法有4种重载形式,定义如下: public Me

Android:WebView中对图片注册上下文菜单

前言 今天一朋友问我一个问题,就是如何在WebView控件中的图片增加上下文菜单,以便增加保存图片等功能.今天就给他简单做了一个演示Demo,现写下来,给有相同问题的朋友提供些许思路吧. 概要实现 其实这个功能很简单,没有太复杂的东西,就是对WebView的控件的使用,一是给WebView注册了上下文菜单事件,二是在响应事件中去判断事件源的类型,如果是图片类型,则把url取出来 注册上下文菜单事件 这个就比较简单了通过下面的代码即可完成. WebView vw = (WebView) findV

Android菜单详解(一)——理解android中的Menu

前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至今为止看到的最好的一本android书,中文版出到<精通Android 2>. 理解Android的菜单 菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Menu"键,由此可见菜单在Android程序中的特殊性.An

上下文菜单和Contextual Action Mode(学习Android Programming The Big Nerd Ranch Guide)

在Android Programming The Big Nerd Ranch Guide书中,讲解上下文菜单的实现,添加一个删除菜单. 在Honeycomb发布前的设备里,上下文的action都是以悬浮的上下文菜单形式呈现.在之后的设备里,推荐用上下文的action bar的方式去呈现上下文的action.上下文的action bar展现在一个activity的顶部. 运行在Honeycomb之前版本的程序,有些也会出现上下文action bar.那是因为它使用了第三方库,这个库名字是Acti