AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.android.notepad">    <application android:icon="@drawable/app_notes"        android:label="@string/app_name">        <provider android:name="NotePadProvider"            android:authorities="com.google.provider.NotePad"        />        <activity android:name="NotesList" android:label="@string/title_notes_list">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>            <intent-filter>                <action android:name="android.intent.action.VIEW" />                <action android:name="android.intent.action.EDIT" />                <action android:name="android.intent.action.PICK" />                <category android:name="android.intent.category.DEFAULT" />                <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />            </intent-filter>            <intent-filter>                <action android:name="android.intent.action.GET_CONTENT" />                <category android:name="android.intent.category.DEFAULT" />                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />            </intent-filter>        </activity>                <activity android:name="NoteEditor"            android:theme="@android:style/Theme.Light"            android:label="@string/title_note"            android:screenOrientation="sensor"            android:configChanges="keyboardHidden|orientation"        >            <!-- This filter says that we can view or edit the data of                 a single note -->            <intent-filter android:label="@string/resolve_edit">                <action android:name="android.intent.action.VIEW" />                <action android:name="android.intent.action.EDIT" />                <action android:name="com.android.notepad.action.EDIT_NOTE" />                <category android:name="android.intent.category.DEFAULT" />                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />            </intent-filter>            <!-- This filter says that we can create a new note inside                 of a directory of notes. -->            <intent-filter>                <action android:name="android.intent.action.INSERT" />                <category android:name="android.intent.category.DEFAULT" />                <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />            </intent-filter>        </activity>        <activity android:name="TitleEditor" android:label="@string/title_edit_title"android:theme="@android:style/Theme.Dialog"                android:windowSoftInputMode="stateVisible">            <!-- This activity implements an alternative action that can be                 performed on notes: editing their title.  It can be used as                 a default operation if the user invokes this action, and is                 available as an alternative action for any note data. -->            <intent-filter android:label="@string/resolve_title">                <!-- This is the action we perform.  It is a custom action we                     define for our application, not a generic VIEW or EDIT                     action since we are not a general note viewer/editor. -->                <action android:name="com.android.notepad.action.EDIT_TITLE" />                <!-- DEFAULT: execute if being directly invoked. -->                <category android:name="android.intent.category.DEFAULT" />                <!-- ALTERNATIVE: show as an alternative action when the user is                     working with this type of data. -->                <category android:name="android.intent.category.ALTERNATIVE" />                <!-- SELECTED_ALTERNATIVE: show as an alternative action the user                     can perform when selecting this type of data. -->                <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />                <!-- This is the data type we operate on. -->                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />            </intent-filter>        </activity>            </application></manifest>



程序先检索
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
的 Activity组件,并根据 android:name="NotesList" 和 package="com.example.android.notepad" 找到 类完全限定路径 com.example.android.notepad.NotesList 类,初始Activity,执行
onCreate(Bundle savedInstanceState)方法.

NotesList.java
package com.example.android.notepad;import com.example.android.notepad.NotePad.Notes;import android.app.ListActivity;import android.content.ComponentName;import android.content.ContentUris;import android.content.Intent;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.util.Log;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ContextMenu.ContextMenuInfo;import android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleCursorAdapter;public class NotesList extends ListActivity {    private static final String TAG = "NotesList";    // Menu item ids    public static final int MENU_ITEM_DELETE = Menu.FIRST; //1    public static final int MENU_ITEM_INSERT = Menu.FIRST + 1; //2    /**     * 数据库中感兴趣的列     */    private static final String[] PROJECTION = new String[] {            Notes._ID, // 0 "_id"            Notes.TITLE, // 1 "title"    };    /** 标题列索引 */    private static final int COLUMN_INDEX_TITLE = 1;        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);                /*          * public final void setDefaultKeyMode(int mode)         * 设置按键处理快捷方式         */        setDefaultKeyMode(DEFAULT_KEYS_SHORTCUT);                /*         *  创建一个Intent,如果没有数据则使用默认的内容提供商         */        Intent intent = getIntent();        if (intent.getData() == null) {            intent.setData(Notes.CONTENT_URI);        }                /*         *  public ListView getListView()         *  注册 createContextMenu 监听器          */        getListView().setOnCreateContextMenuListener(this);                /*         * 定义游标对象         * public final Cursor managedQuery(Uri uri         * , String[] projection             *   , String selection         *, String[] selectionArgs         *, String sortOrder)         * 执行一个查询,并将结果游标返回         * public Intent getIntent()         * 返回调用此组件的 Intent.         * projection: PROJECTION 列数组         * selection : where         * selectionArgs : 参数         * sortOrder : 排序         *          * 执行一个可管理的查询,并且Activity组件管理查询的关闭和重新查询.         */        Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null, null,                Notes.DEFAULT_SORT_ORDER);        /*         * 创建一个简单游标适配器, 绑定列与视图         * public SimpleCursorAdapter(Context context         * , int layout         * , Cursor c         * , String[] from         * , int[] to)         * context : 包含ListView的组件         * layout : 包含to的布局文件         * c : 游标         * from : 列数组         * to : 视图id数组         * 映射从数据库到视图的日志条目         */        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.noteslist_item, cursor,                new String[] { Notes.TITLE }, new int[] { android.R.id.text1 });                /*         * public void setListAdapter(ListAdapter adapter)          * 为ListView提供游标         */        setListAdapter(adapter);    }        /*     * 初始化标准选项菜单内容,只在每一次显示前调用.     * 注意,它在onPrepareOptionsMenu之前调用.     * 返回值为真,则显示菜单,否则不显示.     */    @Override    public boolean onCreateOptionsMenu(Menu menu) {        super.onCreateOptionsMenu(menu);        // This is our one standard application action -- inserting a        // new note into the list.        menu.add(0, MENU_ITEM_INSERT, 0, R.string.menu_insert)                .setShortcut('3', 'a')                .setIcon(android.R.drawable.ic_menu_add);        // Generate any additional actions that can be performed on the        // overall list.  In a normal install, there are no additional        // actions found here, but this allows other applications to extend        // our menu with their own actions.        Intent intent = new Intent(null, getIntent().getData());        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);        menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0,                new ComponentName(this, NotesList.class), null, intent, 0, null);        return true;    }        /*     * 准备显示屏幕标准选项.每次菜单显示前调用.可以通过这个方法启用/禁止菜单项或动态修改菜单内容.     * 默认根据Activity状态更新系统菜单项.引申类必须调用基类实现.     * 返回值为真,则显示菜单,否则不显示.     */    @Override    public boolean onPrepareOptionsMenu(Menu menu) {        super.onPrepareOptionsMenu(menu);        final boolean haveItems = getListAdapter().getCount() > 0;        // If there are any notes in the list (which implies that one of        // them is selected), then we need to generate the actions that        // can be performed on the current selection.  This will be a combination        // of our own specific actions along with any extensions that can be        // found.        if (haveItems) {            // This is the selected item.            Uri uri = ContentUris.withAppendedId(getIntent().getData(), getSelectedItemId());            // Build menu...  always starts with the EDIT action...            Intent[] specifics = new Intent[1];            specifics[0] = new Intent(Intent.ACTION_EDIT, uri);            MenuItem[] items = new MenuItem[1];            // ... is followed by whatever other actions are available...            Intent intent = new Intent(null, uri);            intent.addCategory(Intent.CATEGORY_ALTERNATIVE);            menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0, null, specifics, intent, 0,                    items);            // Give a shortcut to the edit action.            if (items[0] != null) {                items[0].setShortcut('1', 'e');            }        } else {            menu.removeGroup(Menu.CATEGORY_ALTERNATIVE);        }        return true;    }        /*     * 选项菜单的菜单项 单击回调     */    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {        case MENU_ITEM_INSERT:            // Launch activity to insert a new item            startActivity(new Intent(Intent.ACTION_INSERT, getIntent().getData()));            return true;        }        return super.onOptionsItemSelected(item);    }        /*     * 每次显示上下文菜单前调用.     */    @Override    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {        AdapterView.AdapterContextMenuInfo info;        try {             info = (AdapterView.AdapterContextMenuInfo) menuInfo;        } catch (ClassCastException e) {            Log.e(TAG, "bad menuInfo", e);            return;        }        Cursor cursor = (Cursor) getListAdapter().getItem(info.position);        if (cursor == null) {            // For some reason the requested item isn't available, do nothing            return;        }        // Setup the menu header        menu.setHeaderTitle(cursor.getString(COLUMN_INDEX_TITLE));        // Add a menu item to delete the note        menu.add(0, MENU_ITEM_DELETE, 0, R.string.menu_delete);    }        /*     * 上下文菜单的菜单项单击回调     */    @Override    public boolean onContextItemSelected(MenuItem item) {        AdapterView.AdapterContextMenuInfo info;        try {             info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();        } catch (ClassCastException e) {            Log.e(TAG, "bad menuInfo", e);            return false;        }        switch (item.getItemId()) {            case MENU_ITEM_DELETE: {                // Delete the note that the context menu is for                Uri noteUri = ContentUris.withAppendedId(getIntent().getData(), info.id);                getContentResolver().delete(noteUri, null, null);                return true;            }        }        return false;    }        /*     * ListView 列表项单击事件回调     */    @Override    protected void onListItemClick(ListView l, View v, int position, long id) {        Uri uri = ContentUris.withAppendedId(getIntent().getData(), id);                String action = getIntent().getAction();        if (Intent.ACTION_PICK.equals(action) || Intent.ACTION_GET_CONTENT.equals(action)) {            // The caller is waiting for us to return a note selected by            // the user.  The have clicked on one, so return it now.            setResult(RESULT_OK, new Intent().setData(uri));        } else {            // Launch activity to view/edit the currently selected item            startActivity(new Intent(Intent.ACTION_EDIT, uri));        }    }}


菜单分类:
上下文菜单: 不支持快捷方式和图标.
选项菜单: 图标菜单不支持check标记,且菜单标题紧凑显示.最多显示6个,其余显示为more.
子菜单: 不支持图标,不能嵌套子菜单.

更多相关文章

  1. android 右上角菜单无法显示
  2. 为Android内核添加新驱动,并添加到menuconfig菜单
  3. Android Material Design: NavigationView抽屉导航菜单(策滑功能
  4. android 菜单事件处理
  5. android下拉菜单spinner的使用方法
  6. Android 系统菜单与自定义菜单

随机推荐

  1. android资料下载地址汇总
  2. Android获取本机Mac地址和IP地址
  3. Android(安卓)dependency ‘androidx.cor
  4. Android(安卓)SQLite是线程安全的吗?
  5. android viewholder
  6. android EditText 去除边框
  7. Android(安卓)通知的基本用法示例代码
  8. 布局的学习
  9. Android上发送带附件的邮件
  10. Android(安卓)TelephonyManager类