53
ANDROID PROGRAMMING2

ANDROID PROGRAMMING2

  • Upload
    bat

  • View
    65

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

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