Top Banner
ANDROID PROGRAMMING2
53

ANDROID PROGRAMMING2

Jan 17, 2016

Download

Documents

bat

ANDROID PROGRAMMING2. OUTLINE. 加入新 Activity AndroidManifest.xml Activity 間的資料傳送 Intent SQLite 資料庫. 加入新 ACTIVITY. 一個 java 檔對應一個 xml 檔. Report.java. Report.xml. 加入新 ACTIVITY: REPORT.XML. Like main.xml. 加入新 ACTIVITY: REPORT.JAVA. INTENT. 加入新 Activity: 修改原 Activity. 建立 Intent 實體. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: ANDROID PROGRAMMING2

ANDROID PROGRAMMING2

Page 2: ANDROID PROGRAMMING2

OUTLINE

加入新 Activity AndroidManifest.xml Activity 間的資料傳送 Intent SQLite 資料庫

Page 3: ANDROID PROGRAMMING2

加入新 ACTIVITY

一個 java 檔對應一個 xml 檔

Report.javaReport.java Report.xmlReport.xml

Page 4: ANDROID PROGRAMMING2

加入新 ACTIVITY: REPORT.XML Like main.xml

Page 5: ANDROID PROGRAMMING2

加入新 ACTIVITY: REPORT.JAVA

Page 6: ANDROID PROGRAMMING2

INTENT

Page 7: ANDROID PROGRAMMING2

加入新 Activity: 修改原 Activity

建立 Intent 實體

Page 8: ANDROID PROGRAMMING2

加入新 Activity: 修改原 Activity

setClass( 原 Activity, 新Activity)

Page 9: ANDROID PROGRAMMING2

加入新 Activity: 修改原 Activity

Page 10: ANDROID PROGRAMMING2

AndroidManifest.xml 是一個用來描述 Android 應用程式「整體資訊」的設定檔。可以向 Android 系統介紹我們的 Android 應用程式,以便讓 Android 系統完整地了解我們的應用程式資訊。

ANDROIDMANIFEST.XML

Page 11: ANDROID PROGRAMMING2

ANDROIDMANIFEST.XML程式進入點

Page 12: ANDROID PROGRAMMING2

ANDROIDMANIFEST.XML

版本

Page 13: ANDROID PROGRAMMING2

ANDROIDMANIFEST.XML Application 標籤 :定義應用程式用到的Activity 、服務資訊

Page 14: ANDROID PROGRAMMING2

ANDROIDMANIFEST.XML這個 Activity 所對應的類別com.demo.android.bmi.B

mi

Page 15: ANDROID PROGRAMMING2

ANDROIDMANIFEST.XML

這個 Activity 式此應用程式的進入點

此 Activity 將顯示在Launcher 的應用程式列

Page 16: ANDROID PROGRAMMING2

ACTIVITY

獨立的 Activity 單純的從一個螢幕跳到下個螢幕,不涉及資料的交

換。

相依的 Activity 從一個螢幕跳到下個螢幕時,攜帶資料供下一個螢

幕( Activity )使用

Page 17: ANDROID PROGRAMMING2

ACTIVITY 間資料傳送 : 傳遞資料

把要傳送的東西用bundle 包起來

將 bundle 附加在intent 上

Page 18: ANDROID PROGRAMMING2

ACTIVITY 間資料傳送 : 傳遞資料

取出 field_height的值轉成字串

在新的 Activity 中用 KEY_HEIGHT識別符號來存取這

個值

Page 19: ANDROID PROGRAMMING2

ACTIVITY 間資料傳送 : 接收資料取得傳來的 Intent

取得附加在 Intent上的 bundle 物件

Page 20: ANDROID PROGRAMMING2

ACTIVITY 間資料傳送 : 接收資料

透過KEY_HEIGHT 識

別符號取出存在其中的資料

Page 21: ANDROID PROGRAMMING2

INTENT

現成的 Intent Ex. 開啟網頁

自訂的 Intent Ex. 切換 Activity 、在其間傳遞各式的資料。

Page 22: ANDROID PROGRAMMING2

INTENT

提供網址給Inten.ACTION_VIEW動作 , 便會開啟網頁瀏

覽器

Page 23: ANDROID PROGRAMMING2

LIST ACTIVITY

筆記本程式 用一個列表來顯示所有的記事條目 增加一筆條目 刪除選擇的條目 編輯選擇的條目

Page 24: ANDROID PROGRAMMING2

DUMMYNOTE.JAVA

Activity

ListActivity

Page 25: ANDROID PROGRAMMING2

DUMMYNOTE.JAVA

自訂的字串陣列,會透過 Adapter 以 List的形式顯示在螢幕上

Page 26: ANDROID PROGRAMMING2

DUMMYNOTE.JAVA

將字串陣列傳給他並設定好Adapter

Page 27: ANDROID PROGRAMMING2

MAIN.XML

在 xml 檔裡定義ListView 元件

Page 28: ANDROID PROGRAMMING2

MAIN.XML

設定當列表是空的時候 ( 沒有資料 ) 要顯示的內

Page 29: ANDROID PROGRAMMING2

SQLITE

在嵌入式系統中常見的資料庫,所有的資料都存在一個檔案中,便於遷移。

占用相對於其他資料庫來的少的記憶體空間

使用 SQL 語句來查詢 (SELECT) 、新增 (INSERT) 、修改 (UPDATE) 、刪除 (DELETE) 、定義資料格式(CREATE TABLE) 等。

Page 30: ANDROID PROGRAMMING2

DATABASEHELPER

繼承 SQLiteOpenHelper

協助我們 : 建立資料表 管理資料表

Page 31: ANDROID PROGRAMMING2

public class NotesDbAdapter {

private static final String DATABASE_NAME = "notes.db";

private static final int DATABASE_VERSION = 1;

.......

private static class DatabaseHelper extends SQLiteOpenHelper{

public DatabaseHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

}

}

NOTESDBADAPTER.JAVA(DATABASEHELPER: 建構子 )

物件,可以控制資料庫的開啟和關閉

做複雜的查詢,一般用不到

傳入資料庫名稱

傳入資料庫版本

Page 32: ANDROID PROGRAMMING2

public class NotesDbAdapter {

private static final String DATABASE_CREATE =

"create table notes("

+"_id INTEGER PRIMARY KEY,"

+"note TEXT,"

+"created INTEGER,"

+"modified INTEGER"

+");“;

….

private static class DatabaseHelper extends SQLiteOpenHelper{

public void onCreate(SQLiteDatabase db) {

db.execSQL(DATABASE_CREATE);

}

}

}

NOTESDBADAPTER.JAVA( DATABASEHELPER: ONCREATE() )

建立一個名為 notes 的資料表。資料表中有四個欄位, _id 欄位會自動計數, note 欄位儲存文字型態, created和 modified 欄位儲存數字型態。

Page 33: ANDROID PROGRAMMING2

public class NotesDbAdapter {

private static final String DATABASE_CREATE =

"create table notes("

+"_id INTERGER PRIMARY KEY,"

+"note TEXT,"

+"created INTEGER,"

+"modified INTEGER"

+");“;

….

private static class DatabaseHelper extends SQLiteOpenHelper{

public void onCreate(SQLiteDatabase db) {

db.execSQL(DATABASE_CREATE);

}

}

}

NOTESDBADAPTER.JAVA( DATABASEHELPER: ONCREATE() )

傳入 SQL 語句

Page 34: ANDROID PROGRAMMING2

public class NotesDbAdapter {

private static final String DATABASE_TABLE = "notes";

….

private static class DatabaseHelper extends SQLiteOpenHelper{

…. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL(“DROP TABLE IF EXISTS "+DATABASE_TABLE);

onCreate(db);

}

}}

}

若舊版本存在,就將其移除

重新建立資料表

NOTESDBADAPTER.JAVA( DATABASEHELPER: ONUPGRADE() )

Page 35: ANDROID PROGRAMMING2

public class NotesDbAdapter {

private Context mCtx = null;

….

public NotesDbAdapter(Context ctx){

this.mCtx = ctx;

}

}

NOTESDBADAPTER.JAVA( 建構子 )

Page 36: ANDROID PROGRAMMING2

public class NotesDbAdapter {

private Context mCtx = null;

….

public NotesDbAdapter(Context ctx){

this.mCtx = ctx;

}

}

NOTESDBADAPTER.JAVA( 建構子 )

Page 37: ANDROID PROGRAMMING2

public class NotesDbAdapter {

private DatabaseHelper dbHelper;

private SQLiteDatabase db;

….

public NotesDbAdapter open() throws SQLException{

dbHelper = new DatabaseHelper(mCtx);

db = dbHelper.getWritableDatabase();

return this;

}

}

NOTESDBADAPTER.JAVA( OPEN() )

準備好一個相對應的資料庫給我們使用

Page 38: ANDROID PROGRAMMING2

public class NotesDbAdapter {

….

public void close(){

dbHelper.close();

}

}

NOTESDBADAPTER.JAVA( CLOSE() )

停止對資料的存取

Page 39: ANDROID PROGRAMMING2

public class DummyNote extends ListActivity {

….

private NotesDbAdapter mDbHelper;

private void setAdapter() {

mDbHelper = new NotesDbAdapter(this);

mDbHelper.open();

ListAdapter adapter = new ArrayAdapter<String> (this,android.R.layout.simple_list_item_1,note_array);

setListAdapter(adapter);

}

}

DUMMYNOTE.JAVA

在主程式中透過 open() 打開資料庫

Page 40: ANDROID PROGRAMMING2

public class NotesDbAdapter {

….

public Cursor getall(){

return db.rawQuery("SELECT * FROM notes", null);

}

}

NOTESDBADAPTER.JAVA( 加入查詢 )

rawQuery 可以執行SQL 語法,傳回一個指針 (Cursor) 。指針 (Cursor) 類別是用來存取查詢的結果,程式需要資料表時再透過指針來存取。

SQL 語法 (SELECT 欄位 FROM 資料表 ) 。從 notes 資料表中選擇全部資料。

Page 41: ANDROID PROGRAMMING2

public class DummyNote extends ListActivity {

private NotesDbAdapter mDbHelper;

private Cursor mNotesCursor;

….

private void fillData(){

mNotesCursor = mDbHelper.getall();

startManagingCursor(mNotesCursor);

….

}

}

DUMMYNOTE.JAVA( 與列表聯繫 )

返回能查詢資料表所有的資料的指針,儲存到 mNotesCursor中

讓 Activity 可以基於本身的生命週期,一併管理 Cursor 的生命週期。

Page 42: ANDROID PROGRAMMING2

DUMMYNOTE.JAVA( 與列表聯繫 )

public class DummyNote extends ListActivity {

….

private void fillData(){

….

String[] from = new String[]{"note"};

int[] to = new int[]{android.R.id.text1};

SimpleCursorAdapter adapter =

new SimpleCursorAdapter(this,

android.R.layout.simple_list_item_1,mNotesCursor,from,to);

setListAdapter(adapter);

}}

將接口和ListView連接

從資料表端的 note 欄位 (from)映射到android.R.layout.simple_list_item_1每一列描述格式中的text1 欄位 (to) 裡

Page 43: ANDROID PROGRAMMING2

CRUD 增刪改查 Create: 新增 Retrieve: 檢索 Update: 更新 Delete: 刪除

Page 44: ANDROID PROGRAMMING2

public class NotesDbAdapter {

….

public static final String KEY_ROWID = "_id";

public static final String KEY_NOTE = "note";

public static final String KEY_CREATED = "creatred";

String[] strCols = new String[]{KEY_ROWID,KEY_NOTE,KEY_CREATED};

public Cursor getall(){

return db.query(DATABASE_TABLE, // 查詢的資料表名稱strCols, // 查詢的資料表欄位null, //WHERE 語句null, // WHERE 語句的參數null, //GROUP BY 語句null, //HAVING 語句null); //排序語句

}

}

NOTESDBADAPTER.JAVA( 檢索 )

Page 45: ANDROID PROGRAMMING2

NOTESDBADAPTER.JAVA( 新增 )public class NotesDbAdapter {

….

public long create(String Note){

Date now = new Date();

ContentValues args = new ContentValues();

args.put(KEY_NOTE, Note);

args.put(KEY_CREATED, now.getTime());

return db.insert(DATABASE_TABLE, null, args);

}

}

內容值類別

用 put方法將一對( 識別符號 , 內容值 )放進ContentValues

Page 46: ANDROID PROGRAMMING2

NOTESDBADAPTER.JAVA( 新增 )public class NotesDbAdapter {

….

public long create(String Note){

Date now = new Date();

ContentValues args = new ContentValues();

args.put(KEY_NOTE, Note);

args.put(KEY_CREATED, now.getTime());

return db.insert(DATABASE_TABLE, null, args);

}

} 建立現在時間,並填入 created 欄位

Page 47: ANDROID PROGRAMMING2

NOTESDBADAPTER.JAVA( 新增 )public class NotesDbAdapter {

….

public long create(String Note){

Date now = new Date();

ContentValues args = new ContentValues();

args.put(KEY_NOTE, Note);

args.put(KEY_CREATED, now.getTime());

return db.insert(DATABASE_TABLE, // 資料表名稱null, args); // 內容值

}Insert方法可以插入資料條目

Page 48: ANDROID PROGRAMMING2

NOTESDBADAPTER.JAVA( 刪除 )public class NotesDbAdapter {

….

public boolean delete(long rowId){

return db.delete(DATABASE_TABLE, // 資料表名稱KEY_ROWID + “=” + rowId, //WHERE 語句null)>0; //WHERE 語句的參數

}

}

如果找不到這筆資料id ,刪除失敗,回傳0

Page 49: ANDROID PROGRAMMING2

DUMMYNOTE.JAVA( 新增 , 刪除 )

public class DummyNote extends ListActivity {

….

protected static final int MENU_INSERT = Menu.FIRST;

protected static final int MENU_DELETE = Menu.FIRST+1;

public boolean onCreateOptionsMenu(Menu menu){

menu.add(0,MENU_INSERT,0," 新增 ");

menu.add(0,MENU_DELETE,0," 刪除 ");

return super.onCreateOptionsMenu(menu);

}

} 建立一個 menu 選單,有新增和刪除兩個選項

Page 50: ANDROID PROGRAMMING2

DUMMYNOTE.JAVA( 新增 , 刪除 )

public class DummyNote extends ListActivity {

private int mNoteNumber =1;

….

public boolean onOptionsItemSelected(MenuItem item){

switch(item.getItemId()){

case MENU_INSERT:

String noteName = "Note " + mNoteNumber++;

mDbHelper.create(noteName);

fillData();

case MENU_DELETE:

mDbHelper.delete(getListView().getSelectedItemId());

fillData();

}

return super.onOptionsItemSelected(item);

}

}

新增一筆資料,並呼叫 fillData()更新列表檢視畫面

Page 51: ANDROID PROGRAMMING2

DUMMYNOTE.JAVA( 新增 , 刪除 )

public class DummyNote extends ListActivity {

private int mNoteNumber =1;

….

public boolean onOptionsItemSelected(MenuItem item){

switch(item.getItemId()){

case MENU_INSERT:

String noteName = "Note " + mNoteNumber++;

mDbHelper.create(noteName);

fillData();

case MENU_DELETE:

mDbHelper.delete(getListView().getSelectedItemId());

fillData();

}

return super.onOptionsItemSelected(item);

}

}

刪除一筆資料,並呼叫 fillData()更新列表檢視畫面

Page 52: ANDROID PROGRAMMING2

NOTESDBADAPTER.JAVA( 查詢單筆條目 )public class NotesDbAdapter {

….

public Cursor get(long rowId) throws SQLException{

Cursor mCursor = db.query(true,DATABASE_TABLE, new String[] {KEY_ROWID,KEY_NOTE,KEY_CREATED}, KEY_ROWID+"="+rowId,

null,null,null,null,null);

if(mCursor != null)

mCursor.moveToFirst();

return mCursor;

}}

查詢單筆資料需要條件

如果指針存在的話,就把指針移到查詢到的第一筆條目上。

Page 53: ANDROID PROGRAMMING2

NOTESDBADAPTER.JAVA( 修改 )

public class NotesDbAdapter {

….

public boolean update(long rowId,String note){

ContentValues args = new ContentValues();

args.put(KEY_NOTE, note);

return db.update(DATABASE_TABLE, // 資料表名稱args, // 新的內容值KEY_ROWID+“=”+rowId, //WHERE 語

句null)>0;

}

}

update() 可以更新資料條目。

沒有修改到條目會回傳false