Android入门开发指南之七 -- 指南:Notepad 练习1 (下)

 
9
onCreate() 方法中添加代码。
这里我们将设置 activity 的标题 ( 显示在屏幕顶端 ) ,使用 notepad_list 布局,我们为 activity 创建显示内容,建立 DBHelper 实例用来访问数据,然后将可显示的文本标题和列表关联起来。
a.      调用 super() icicle 参数,传入到我们的方法中。
b.      R.layout.notepad_list 中调用 setContentView
c.       为类 DBHelper 创建一个新的名为 dbHelper 的私有类成员(放在 onCreate 方法之前)。
d.      onCreate 方法后面,构造一个 DBHelper 实例,并分配 dbHelper 成员(注意:你必须传递 this 引用到 DBHelper 的构造函数中)。
e.      最后,调用一个新的方法 fillData()- 获取数据平且使用 helper 进行关联,我们在这里还没有定义它。
f.         onCreate() 现在看起来应该像这个样子:
g.             @Override
h.             public void onCreate(Bundle icicle)
i.             {
j.                 super.onCreate(icicle);
k.                 setContentView(R.layout.notepad_list);
l.                 dbHelper = new DBHelper(this);
m.                 fillData();
n.             }
同时记住添加 DBHelper 成员定义(在 NoteNumber 定义中)。
    private DBHelper dbHelper;
10
更多菜单内容
我们构建的 Notepad 应用仅仅触及到菜单的表面。你还可以为你的菜单添加菜单项,创建子菜单甚至是添加菜单项到其它应用中。
onCreateOptionsMenu() 函数体中填入代码。
我们将只添加一个菜单项, ”Add Item”, 使用我们在 string.xml 中创建,使用一个常量定义的字符创。我们将创建在类的顶部,用来标识添加菜单项的操作。
a.      strings.xml 资源中 ( res/valuse 目录下 ) ,为 menu_insert 添加一个新的字符串,文本为 ”Add Item”, <string name="menu_insert">Add Item</string> , 然后保存这个文件。
b.      同样,你需要一个菜单位置长廊,在 Notepadv1 类的顶部(刚好在 KEY_BODY 定义下面)
public static final int INSERT_ID = Menu.FIRST;
c.       在方法 onCreateOptionsMenu() 中,添加菜单项。同样注意 super 调用返回的结果,整个完成之后的方法看上去应该像这个样子 :
d.             @Override
e.             public boolean onCreateOptionsMenu(Menu menu) {
f.                 boolean result = super.onCreateOptionsMenu(menu);
g.                 menu.add(0, INSERT_ID, R.string.menu_insert);
h.                 return result;
i.             }
     
11
onOptionsItemSelected() 方法中添加代码:
这个方法用来处理我们新的 ”Add Note” 菜单项的选择动作。当这个选中的方法调用 item.getID() 获得的值为 INSERT_ID (我们用来标识菜单项)时,我们可以检测到用户选择菜单动作,并且执行适当的处理。
a.      super.onOptionsItemSelected(item) 方法在这个函数结尾运行 - 我们希望能够首先捕获我们的事件。
b.      返回值上的 Switch 语句
c.       case INSERT_ID:
d.      调用方法 createNote()
e.      case 语句结束处添加 break;
f.         在函数末尾返回 superclass onOptionsItemSelected() 的返回值。
g.      现在整个 onOptionsItemSelect() 函数看起来像这个样子:
h.             @Override
i.             public boolean onOptionsItemSelected(Item item) {
j.                 switch (item.getId()) {
k.                 case INSERT_ID:
l.                     createNote();
m.                     break;
n.                 }
o.                
p.                 return super.onOptionsItemSelected(item);
q.             }
   
12
添加一个新的 createNote() 方法 
在应用程序的第一版中, createNote() 不是非常有用 . 我们将简单创建一个带标题的文本,标题基于一个计数器 (“Note1”,”Note2”) ,文本正文为空。现在我们还没有办法编辑文本内容,所以现在我们将创建一个带默认值的文本。
a.      字符串 noteName = “Note” + noteNumber++; ( 使用 ”Note” 和我们在类里面定义得计数器构造名字 );
b.      使用 noteName 作为标题,空字符 ”” 作为正文调用函数 dbHelper.createRow()
c.       Call fillData() method again after adding (inefficient but simple)
d.      The whole createNote() method should look like this:
e.             private void createNote() {
f.                 String noteName = "Note " + noteNumber++;
g.                 dbHelper.createRow(noteName, "");
h.                 fillData();
i.             }
     
13
列表适配器
我们例子使用了一个简单的数组适配器,它将一个数组或者列表元素绑定到一个 ListView, Android 中更通用的做法是,列表适配器和 ContentPorvider 一起工作,这也是一个使用列表的非常简单的方法。
绑定一个 ContentProvider 到一个 ListView ,你可以使用一个 android.widget.SimpleCuresorAdapter 来绑定 contertProvider 中提供的数据到 ListView
定义 fillData 方法,这个过程相对长一点:
这个方法使用 ArrayAdapter 它是最简单的将数据导入 ListView 中的方法。 ArrayAdapter 不仅获取一个列表或者字符串数组,还把它们绑定到一个文本视图中,这个视图在布局中定义为列表行(这个就是我们的 notes_row.xml 布局中的 text1 域)。这个方法简单的从 helper 数据库中获取一列文本,使用每一行的文本标题构造一个字符串列表,然后在这些列表项之上创建一个 ArrayAdapter ,然后绑定我们定义的 notes_row.( The method simply obtains a list of notes from the database helper, constructs a List of Strings using the title strings from each row, and then creates an ArrayAdapter out of those items and bound to use the notes_row we defined. 没有完全理解 )
    private void fillData() {
        // We need a list of strings for the list items
        List<String> items = new ArrayList<String>();
 
        // Get all of the rows from the database and create the item list
        List<Row> rows = dbHelper.fetchAllRows();
        for (Row row : rows) {
            items.add(row.title);
        }
        // Now create an array adapter and set it to display using our row
        ArrayAdapter<String> notes =
            new ArrayAdapter<String>(this, R.layout.notes_row, items);
        setListAdapter(notes);
    }
a.      ArrayAdapter 需要一个字符串列表 ( List<String> ) ,包含要显示的项。
b.      数据从数据库中一行行读出,每一行的标题域构成列表字符串。
c.       我们指定我们创建的 notes_row 视图作为数据容器。
d.      如果你发现没有报告过的类错误,你可以按组合键 ctrl-shift-O( Mac 上是 cmd-shift-O) 生成错误报告。
注意:在这个联系中,我们使用了一个 ArrayAdapter ,这并不是一个通用的做法,更典型的做法是,使用一个 SimpleCursorAdapter ContentProvider ,或者至少从一次查询中返回一个 Cursor ,查看 List Adapters 上的工具条获取更多的信息。
14
运行程序!
a.      在工程 Notepadv1 上右击
b.      从弹出菜单中选择 Run As -> Android Application
c.       如果你看到一个对话框弹出来,选择 Android 启动器作为运行应用程序的方法 ( 你也可以使用对话框顶部的链接作为你的工作区的默认值,这是推荐使用的,因为它可以组织插件每次运行时等询问 )
d.      点击菜单按钮,从菜单中选择 ”Add item” 添加新的文本。
解决方案以及下一步
你可以拿你自己的实现方法与 zip 文件中 Notepadv1Solution 的类实现办法作比较,一旦你完全掌握,让我们进入指南练习 2 中,添加创建,编辑和删除文本的功能。
返回指南主页进入下一个练习。
 

猜你喜欢

转载自blog.csdn.net/wellshine/article/details/1907731