`

Android 示例之 notepad

阅读更多
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.
子菜单: 不支持图标,不能嵌套子菜单.
分享到:
评论

相关推荐

    2011.09.23——— android sample之Notepad(context menu)

    标题中的“2011.09.23——— android sample之Notepad(context menu)”表明这是一个关于Android应用开发的示例项目,具体是针对Notepad应用的上下文菜单(Context Menu)功能的实践。在Android开发中,上下文菜单是...

    android SDK 下 NotePad例子详解

    "NotePad"是Android SDK中一个经典的示例应用,主要用于教授基本的数据库操作、UI设计以及活动(Activity)管理等Android开发核心概念。 首先,NotePad应用展示了如何创建一个简单的笔记管理应用。在这个应用中,...

    安卓Android源码——NotePad便签.zip

    在Android操作系统中,NotePad是经典的示例应用,用于展示基本的数据库操作、UI设计以及事件处理等核心功能。这个压缩包文件包含的就是NotePad应用的源代码,是学习Android开发的宝贵资料。通过分析和研究NotePad的...

    android stdio 简易记事本notepad示例程序

    在这个“android stdio 简易记事本notepad示例程序”中,我们将深入探讨如何利用Java语言和Android Studio来创建一个基本的记事本应用,该应用使用SQLite数据库进行数据存储,并支持用户对笔记进行添加、删除、查询...

    BASIC4Android写的NotePad范例

    【标题】"BASIC4Android写的NotePad范例"是一个基于BASIC4Android开发的简单记事本应用程序示例。这个应用展示了如何使用BASIC4Android这种编程语言来创建一个功能基本的记事本,类似于手机或计算机上的文本编辑器。...

    android notePad solution 源码

    总的来说,这个NotePad源码示例为初学者提供了理解Android应用开发的宝贵资源。通过它,你可以学习到如何使用SQLite、ContentProvider、Activity、Intent以及UI设计等多个关键概念,这些都是构建任何Android应用的...

    android NotePad便签源码.rar

    这个项目提供了Android系统中基础记事本功能的实现,是开发者学习Android应用开发,尤其是UI设计、数据存储和基本功能实现的一个良好实践示例。 【描述】"android NotePad便签源码.rar"包含了完整的Android NotePad...

    Notepad记事本源码Android

    首先,Android应用通常使用Java或Kotlin语言编写,因此Notepad源码可能是这两种语言之一。如果使用Java,它会遵循MVC(模型-视图-控制器)架构模式,如果是Kotlin,可能会采用现代的Kotlin最佳实践,如协程和数据类...

    记事本 NotePad

    标题中的“记事本 NotePad”指的是Android操作系统中内置的一款简单文本编辑器——NotePad。这个应用主要用于创建、查看和编辑纯文本文件,是初学者学习Android应用开发时经常会接触到的一个示例项目。 描述中提到...

    notepad++日志分析插件.zip

    四、使用示例 假设你正在处理一个大型web服务器的日志文件,想找出所有HTTP 500错误。你可以打开日志文件,然后使用AnalysePlugin的搜索功能,输入正则表达式"500",所有包含该错误代码的行都会被突出显示。进一步...

    Notepad.zip

    首先,"Notepad.zip"可能是一个简单的示例项目,通常包含了一个基础的文本编辑器应用源代码。这种类型的项目非常适合初学者用来学习Android应用的基本结构和开发流程。在Android Studio中打开这个压缩包,你可以看到...

    NotePad官方资源例子

    【NotePad官方资源例子】是Android开发中的一个经典示例,主要展示了如何使用Java语言来构建一个简单的文本编辑器应用。这个例子对于初学者来说,是深入理解Android平台上的应用程序开发,尤其是用户界面(UI)设计...

    notepad记事本 - 大三下安卓课程设计.zip

    记事本这是 Google SDK 示例 NotePad 的 AndroidStudio 重建版本一功能扩展如下1.增加标题显示2.添加笔记功能3.界面UI美观4. 更改事件的历史 二主界面增加计时器 在NoteEditor.java文件中的updateNote中添加...

    安卓开发-NotePad.zip

    【安卓开发-NotePad.zip】是一个与Android应用开发相关的压缩包,从名称来看,它可能包含了一个名为"NotePad"的示例应用源代码。在Android开发中,NotePad经常被用作初学者学习和练习的基本项目,因为它涉及到常见的...

    android sample

    下面将详细阐述`ApiDemos`和`NotePad`这两个常见的Android示例项目,以及它们所涵盖的关键知识点。 1. **ApiDemos**:ApiDemos是Android SDK中自带的一个示例程序,它几乎涵盖了Android API的所有主要组件和功能。...

    《Android应用开发揭秘》读书笔记

    通过分析Android SDK中的示例项目,如NotePad,可以深入了解框架的内部工作原理和最佳实践,有助于提升开发技能和解决问题的能力。 ### 多媒体 - **音乐播放**:集成音乐播放功能,涉及音频文件的加载、播放控制等...

    Android SDK 目录和作用详解

    Android SDK 是 Android 开发中最重要的组件之一,它提供了大量的开发工具和资源。了解 Android SDK 的目录结构和作用是非常重要的。本文将详细介绍 Android SDK 中各个目录的名称和作用。 1、add-ons 目录 add-...

    精通ANDROID 3(中文版)1/2

    第1章 Android计算平台简介  1.1 面向新PC的全新平台  1.2 Android的历史  1.3 Dalvik VM剖析  1.4 理解Android软件栈  1.5 使用Android SDK开发最终用户应用程序  1.5.1 Android模拟器  1.5.2 ...

    Unity3D Android的配置文件1

    在Notepad++中,可以打开XML文件,然后选择“编码”菜单,选择“转换为UTF-8无BOM”,然后保存文件,这样就能确保XML文件以Android可识别的UTF-8格式进行解析。 在Unity3D中加载XML文件时,可以使用C#内置的`System...

    Android开源测试工具

    此示例展示了如何使用Robotium的API来模拟用户在“NotePad”应用中的操作,包括添加笔记、返回等基本流程。 #### 六、总结 通过以上介绍,我们可以看到Robotium不仅提供了强大的自动化测试功能,还具有很高的灵活...

Global site tag (gtag.js) - Google Analytics