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

来源:互联网 发布:澳门打车软件 编辑:程序博客网 时间:2024/05/22 17:01
 
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,这并不是一个通用的做法,更典型的做法是,使用一个SimpleCursorAdapterContentProvider,或者至少从一次查询中返回一个Cursor,查看List Adapters上的工具条获取更多的信息。
14
运行程序!
a.      在工程Notepadv1上右击
b.      从弹出菜单中选择 Run As -> Android Application
c.       如果你看到一个对话框弹出来,选择Android启动器作为运行应用程序的方法(你也可以使用对话框顶部的链接作为你的工作区的默认值,这是推荐使用的,因为它可以组织插件每次运行时等询问)
d.      点击菜单按钮,从菜单中选择”Add item”添加新的文本。
解决方案以及下一步
你可以拿你自己的实现方法与zip文件中Notepadv1Solution的类实现办法作比较,一旦你完全掌握,让我们进入指南练习2中,添加创建,编辑和删除文本的功能。
返回指南主页进入下一个练习。
 
原创粉丝点击