2014年3月25日 星期二

《Android 初學特訓班》筆記

《Android 初學特訓班》筆記
ㄧ. Android 專案概觀

1.資料夾架構:

(1)src: Java 程式原始碼。底下可再建立不同的套件路徑資料夾。
(2)gen:儲存由編譯器產生的專案資源。
(3)assets:不會產生索引的外部資源(意即不會在 gen/R.java 中產生索引)。
(4)res:產生索引的外部資源。
<1>drawable:圖片、圖示、檔案資源。
<2>layout:介面設定的 XML 檔。
<3>values:參數設定的 XML 檔。


2.在 XML 檔案中使用資源索引的語法:
@類別名稱 / 欄位名稱


3.在 java 檔案中使用資源索引的語法:
R. 類別名稱 . 欄位名稱


4.版面標籤種類:
RadioGroup:將多個 RadioButton 元件組合起來。
語法:
android : 屬性 = " 屬性值 " ...其他屬性>
  android : 屬性 = " 屬性值" ...其他屬性>
 …

PS:RadioButton 的 Checked 屬性為 true,則為預設選取的選項

(1)FrameLayout:框架式版面標籤。
(2)LinearLayout:線性版面標籤。
(3)AbsoluteLayout:絕對位置版面標籤。
(4)RelativeLayout:相對位置版面標籤。
(5)TableLayout:表格式版面標籤。
*預覽圖、詳細介紹及程式碼請參考:Android基础教程(二)之五大布局对象--FrameLayout,LinearLayout ,AbsoluteLayout,RelativeLayout,TableLayout.




二. 基本的介面元件

1.TextView:在畫面上顯示訊息,但不允許輸入資料。

android:layout_height:文字的高度。
(1)fill_parent 、match_parent:填滿整個外框
(2)wrap_content:依文字高度自動調整

android:layout_width:文字的寬度。
(1)fill_parent 、match_parent:填滿整個外框
(2)wrap_content:依文字寬度自動調整

android:text:顯示的文字內容。
android:id:元件的名稱。
android:textColor:文字的顏色,以「#RGB」格式表示。
android:textSize:文字的大小。


2.EditText:提供使用者輸入資料,也可設定輸入資料的類型。

android:lines:最多可以顯示的列數。
android:editable:是否可輸入文字。
android:enabled:是否可作用。
android:numeric:數值輸入的格式。
(1)integer:整數
(2)signed:帶正負數符號的數字
(3)decimal:帶小數點的數字
*可使用「|」設定同時核選多項輸入的格式

android:password:文字輸入後以密碼顯示輸入的文字。
android:phoneNumber:輸入電話號碼(0~9、「+」、「-」、「#」、「*」)。
android:singleline:false可輸入多列;true只能輸入一列。
android:inputType:限定輸入資料的類型。
(1)text:所有字元
(2)textUri:網址
(3)textEmailAddress:電子郵件
(4)textPassword:密碼
(5)number:0~9的數字
(6)date:日期(0~9、「/」)
(7)time:時間(0~9、「:pam」)
(8)phone:電話號碼

android:hint:當輸入欄位為空時顯示的提示訊息。


3.android:id 屬性的設定格式:
android:id = "@+id/ 元件名稱"


4.Button:提供按下按鈕後,透過設定的監聽事件,執行指定的動作。


5.Button 元件觸發事件的程序流程:
(1)藉由 id 編號取得需要使用的介面元件。
(2)在該元件設定偵聽動作以及觸發時要執行的方法名稱。
(3)設定執行方法的程式內容。


6.Button 元件設定偵聽動作:
元件變數.setOnClickListener(執行方法名稱);


7.Button 元件設定按下後的功能:

private Button.OnClickListener 方法名稱 = new Button.OnClickListener(){
    public void onClick(View v){
        程式內容...}};
PS:需 import android.view.View;


8.取得對應的元件,並放入變數中:
變數名稱 = (元件類型)findViewById(R.id.元件名稱);




三. 訊息顯示相關元件

1.Toast:快顯訊息。

makeText:設定欲顯示的字串
show:顯示訊息框

語法:
(1)Toast 變數名稱 = Toast.makeText(主程式類別.this , Text, Time);
(2)變數名稱.show();
*Text:欲顯示之字串
*Time:顯示的時間
<1>Toast.LENGTH_LONG:時間較長
<2>Toast.LENGTH_SHORT:時間較短


2.設定 Toast 元件位置語法:

Toast 變數名稱.setGravity(Gravity, xOffset, yOffset);
*Gravity屬性:
(1)Gravity.CENTER:水平及垂直置中
(2)Gravity.CENTER_HORIZONTAL:水平置中
(3)Gravity.CENTER_VERTICAL:垂直置中
(4)Gravity.RIGHT:螢幕右邊緣
(5)Gravity.LEFT:螢幕左邊緣
(6)Gravity.TOP:螢幕上邊緣
(7)Gravity.BOTTOM:螢幕下邊緣
可使用「|」同時設定多項值


3.取得主程式類別名稱:
getApplicationContext()


4.AlertDialog:互動對話方塊。

setTitle():對話方塊的標題
setIcon():對話方塊的圖示
setMessage():對話方塊的內容
setItems():對話方塊的表列內容
setPositiveButton():在對話方塊中加入 Yes 按鈕
setNegativeButton():在對話方塊中加入 No 按鈕
setNeutralButton():在對話方塊中加入 Ignore 按鈕

語法:
AlertDialog.Builder 變數名稱 = new AlertDialog.Builder(主程式類別);
變數名稱.setTitle("標題");
變數名稱.setIcon(圖示);
變數名稱.setMessage("內容");
變數名稱.show();
PS:需 import android.app.AlertDialog;




四. 單選、複選和下拉式清單

1.CheckBox:複選清單


2.CheckBox 元件設定偵聽動作:

元件變數.setOnCheckedChangeListener(執行方法名稱);


3.CheckBox 元件設定核選後的功能:

private CheckBox.OnCheckedChangeListener 方法名稱 = new CheckBox.OnCheckedChangeListener(){
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){
        if(元件變數.isChecked()){
            程式內容...}}};
PS:需 import android.view.View;



4.RadioButton:單選清單。


5.RadioGroup 元件設定偵聽動作:

元件變數.setOnCheckedChangeListener(執行方法名稱);


6.RadioGroup 元件設定核選後的功能:

private RadioGroup.OnCheckedChangeListener 方法名稱 = new RadioGroup.OnCheckedChangeListener(){
 @Overide
 public void onCheckedChanged(RadioGroup group, int checkedId)/*辨別觸發的選項並取得選項資訊*/{
  程式內容;}};
*取得選項的索引值:int p = group.indexOfChild(RadioButton)findViewById(checkedId));
*取得清單中的選項數目:int count = group.getChildCount();
*檢查是否按下選項:if(checkedId == R.id.id名稱)


7.Spinner:下拉式清單。


8.Spinner 元件觸發事件的程序流程:
(1)建立清單選項的資料來源。
(2)將資料來源設定給 Spinner。
(3)設定 Spinner 的顯示格式。
(4)在 Spinner 加上偵聽動作並設定處理程序。
PS:清單的資料來源是以 ArrayAdapter 物件型式存在,建立方式包含兩種建立方法:
<1>使用陣列方式宣告在程式中。
<2>若有其他語系考量,則將選項清單設定在專案的中,再由程式經由資源類別檔中取得清單陣列來使用。




五. 圖片相關介面元件

1.ImageView:顯示影像。

android:src:圖片來源。
android:scaleType:顯示圖片的縮放方式:
(1)center:按原來尺寸置中顯示。
(2)centerCrop:按比例擴大圖片尺寸置中顯示。
(3)centerInside:將圖片的內容完整置中顯示。
(4)fitCenter:按比例置中完整顯示。
(5)fitEnd:按比例靠右或下完整顯示。
(6)fitStart:按比例靠左或上完整顯示。
(7)fitXY:不按比例依元件大小顯示。
(8)matrix:依 matrix 矩陣來顯示。


2.Gallery:畫廊展示

android:animationDuration:動畫過渡時間。
android:gravity:圖片對齊方式。
android:unselectedAlpha:選中圖片的透明度。
android:spacing:圖片間的間隔。


3.Gallery 元件執行流程:
(1)建立圖片檔案的資料來源。
(2)將資料來源設定給 Gallery。
(3)在 Gallery 加上偵聽動作並設定處理程序。

PS:使用 Gallery 元件的資料來源必須建立一個繼承自 BaseAdapter 的物件來放置想要呈現的圖片資料。繼承後,必須實作以下方法:
<1>加入欲顯示的內容:getView()
<2>取得共有多少張圖片:getCount()
<3>取得目前的選項:getItem()
<4>取得目前選項的 Id:getItemId()


4.GridView:表格展示。

android:numColumns:表格的行數。
android:gravity:圖片對齊方式。
android:horizontalSpacing:圖片的水平間隔。
android:verticalSpacing:圖片的垂直間隔。


5.GridView 元件執行流程:
(1)建立圖片檔案的資料來源。
(2)將資料來源設定給 GridView。
(3)在 GridView 加上偵聽動作並設定處理程序。

PS:使用 Gallery 元件的資料來源必須建立一個繼承自 BaseAdapter 的物件來放置想要呈現的圖片資料。繼承後,必須實作以下方法:
<1>加入欲顯示的圖片:getView()
<2>取得共有多少張圖片:getCount()
<3>取得目前的選項:getItem()
<4>取得目前選項的 Id:getItemId()




六. ListView 介面元件

1.ListView:選項清單。


2.ListView 元件執行流程:
(1)建立清單選項的資料來源。
(2)將資料來源設定給 ListView。
(3)在 ListView 加上偵聽動作並設定處理程序。


PS:選項的資料來源是以 ArrayAdapter 物件型式存在,建立方式包含兩種建立方法:
<1>使用陣列方式宣告在程式中。
<2>若有其他語系考量,則將選項清單設定在專案的中,再由程式經由資源類別檔中取得清單陣列來使用。

3.ListView 更改選項顏色:

資源檔中定義R.drawable.顏色,語法為:
方法名稱.setSelector(R.drawable.顏色);


4.ListView 預設選取項目:

方法名稱.setSelection(n);
//預設選取第 n+1 個項目


5.ListView 選項按鍵過濾:

方法名稱.setTextFilterEnabled(true);


6.layout 內的預設樣式參數:
(1)android.R.layout.simple_list_item_1:一行 text。
(2)android.R.layout.simple_list_item_2:兩行 text,一行 text 較大,一行較小。
(3)android.R.layout.simple_list_item_single_choice:單選按鈕。
(4)android.R.layout.simple_list_item_multiple_choice:多選按鈕。
(5)android.R.layout.simple_list_item_checked:核選按鈕。


7.使用 LayoutInflater 物件在程式中取得自訂版面:

private LayoutInflater myInflater;
convertView = myInflater.inflate(R.layout.mylayout, null);
ImageView imgLogo = (ImageView) convertView.findViewById(R.id.imgLogo);
PS:inflate() 方法取得的版面會以 View 型別的物件傳回,接著就能以 findViewById() 方法取得 版面中的元件。


8.程式中設定自訂版面中的元件內容:

在程式中可以將元件的內容如文字、圖示檔定義在陣列中,再透過改變陣列索引的方式改變元件內容。
int[] resIds = new int[]{R.drawable.bass};
imLogo.setImageResource(resIds[position]);


9.使用 ListView 元件若要自定列表項目,就必須建立一個繼承自 BaseAdapter 的物件來定義版面。繼承後,必須實作以下方法,並將欲顯示的內容定義在 getView() 方法中:
(1)定義欲顯示的內容:getView()
(2)取得選項的數目:getCount()
(3)取得選項中的文字:getItem()
(4)取得陣列索引的 position:getItemId()




七. 功能表選單元件

1.Option Menu:功能表選單。


2.呼叫功能表選單的語法:

方法一:
@Override
public boolean onCreateOptionsMenu(Menu menu){
    程式內容... return super.onCreateOptionMenu(menu);}

方法二:
由功能表的 Source \ Override / Implement Methods 進入對話方塊,在 Activity 選項中核選 onCreateOptionsMenu(Menu) 按下 OK 鈕即可插入到原始碼中。


3.加入功能表項目:

public abstract MenuItem add(int groupId, int itemId, int itemId, int order, int title)
/* groupId:選項群組的 ID,由 0 開始編號。
itemId:單一選項的 ID,可自定義。通常使用 Menu.First來定義第一個選項的常數,以後再以 Menu.First +1 來遞增。
order:選項安排的順序,由 0 開始編號。
title:每個單一選項要顯示的標題。 */

PS:加入快捷鍵:
.setShortcut('0', 'a')


4.功能表選項的處理語法:

方法一:
@Override
public boolean onOptionsItemSelected(MenuItem item){
    程式內容... return super.onOptionsItemSelected(item);}

方法二:
由功能表的 Source \ Override / Implement Methods 進入對話方塊,在 Activity 選項中核選 onOptionsItemSelected(MenuItem item) 按下 OK 鈕即可插入到原始碼中。


5.Context Menu:快顯功能表。


6.加入快顯功能表的選項:

方法一:
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){
    程式內容... super.onCreateContextMenu(menu, v, menuInfo);}
/* View:選取快顯功能表的元件。
ContextMenuInfo:提供選取元件的資訊。
*/
PS:若有多個元件向系統註冊,則必須依據不同元件的名稱,產生不同的快顯功能表,利用 View 型別參數「v」來辨別不同的註冊元件。

方法二:
由功能表的 Source \ Override / Implement Methods 進入對話方塊,在 Activity 選項中核選 onCreateContextMenu(ContextMenu, View, ContextMenuInfo) 按下 OK 鈕即可插入到原始碼中。


7.加入快顯功能表項目:

public abstract MenuItem add(int groupId, int itemId, int itemId, int order, int title)
/* groupId:選項群組的 ID,由 0 開始編號。
itemId:單一選項的 ID,可自定義。通常使用 Menu.First來定義第一個選項的常數,以後再以 Menu.First +1 來遞增。
order:選項安排的順序,由 0 開始編號。
title:每個單一選項要顯示的標題。 */


8.快顯功能表註冊語法:

registerForContextMenu(元件名稱);




八. Intent 的使用

1. 檔案:

(1)在 標籤內,定義應用程式用到的所有元件、服務等。

icon 設定於主畫面中的應用程式圖示。檔案路徑在
label 設定顯示於主畫面中的應用程式名稱。檔案路徑在

(2)在 標籤內

label 屬性定義執行應用程式時顯示的標題名稱。

(3)在 標籤內,定義條件來篩選 Intent 要執行的 Activity。

action 定義 Activity 的執行動作。
category 定義 Activity 所屬類別。若想讓程式一開始就要執行應設定為 LAUNCHER 類別,否則為 DEFAULT 類別。
data 定義 Activity 可以處理的資料類型。


2.Intent:從目前的 Activity 執行另一個 Activity、傳遞參數。


3.Intent 語法:

Intent intent = new Intent (動作, 內容);


4.執行 Activity:

不必傳回返回值:startActivity(定義完成的 Intent);

必須傳回返回值:startActivityForResult(定義完成的 Intent, 動作);


5.Intent 執行自訂 Activity 的方法:
(1)在專案中新增另一個類別,並為該類別製作一個版面配置檔,最後要在 檔宣告加入自訂的類別。
(2)主程式類別切換到自訂類別:setClass(主程式類別.this, 自訂類別.this );


6.Intent 傳遞資料的流程:

(1)使用 setClass 方法指定執行類別。
Intent intent = new Intent();
intent.setClass(傳送者.this, 接收者.class);

(2)依照資料的型別以 Bundle 物件進行打包。
Bundle bundle = new Bundle();
bundle.putString("名稱", "值");
//putBoolean()、putByte()、putInt().....
//putStringArray()、putIntArray()

(3)使用 putExtra 方法加入 Bundle 物件。
intent.putExtras(bundle);

(4)使用 startActivity 方法執行 Intent。
startActivity(intent);


7.從主程式取出 Intent 的資料流程:

(1)以 getIntent() 方法取得傳送的 Intent。
Intent intent = this.getIntent();

(2)利用 Intent 的 getExtras() 方法,從 Intent 中取得 Bundle 物件。
Bundle bundle = intent.getExtras();

(3)根據打包的名稱取得 Bundle 物件中的資料。


8.從主程式取出 Bundle 物件資料:

bundle.getString("名稱");
////getBoolean()、getByte()、getInt().....
//getStringArray()、getIntArray()


9.從「被呼叫」的 Intent 傳回資料:

傳遞資料的執行:
private static final int ACTIVITY_EDIT = 1;
startActivityForResult(intent, ACTIVITY_EDIT);

傳回步驟:
(1)建立 Intent 物件,不必以 setClass() 設定傳送者。
Intent intent = new Intent();

(2)將要回傳的資料放入 Bundle 中,再把這個 Bundle 交給 Intent 處理。
age = Integer.parseInt(edtAge.getText().toString());
Bundle bundle = new Bundle();
bundle.putInt("Age", age);
intent.putExtras(bundle);

(3)以 setResult() 方法將 Intent 傳回,同時必須傳回一個結果的代碼。
setResult(RESULT_OK, intent);

主程式接收傳回的資料,必須覆寫 onActiveResult() 方法:
protected void onActivityResult(int requestCode, int resultCode, Intent data)




九. Activity 的生命週期

1.Activity 運作實的基本狀態:

(1)如果是在畫面前景顯示的 Activity,它是存在並處於運作的狀態。

(2)如果 Activity  失去焦點但仍繼續運作,它會處於暫停的狀態。暫停的 Activity 並沒消失,但如果系統處於低資源的狀態下則會被優先結束回收。

(3)如果 Activity 因為另一個 Activity 的運作而退到背景,它會處於停止的狀態。雖然這個 Activity 會記憶停止前的狀態及資料,但程式視窗會消失在畫面上,而且在系統處於低資源的狀態下會被優先結束回收。

(4)當 Activity 處於暫停或是停止的狀態,系統會視資源的狀況要求結束,甚至直接移除它的活動。當該 Activity 被重新執行時會自動恢復到原來的狀態。


2.Activity 執行的重要循環:

(1)Activity 的完整生命週期是由 onCreate() 開始,最後在 onDestroy() 後結束。系統會在 onCreate() 時配置使用資源,在 onDestroy() 時釋放資源。

(2)Activity 執行到 onStart() 時即可在螢幕上看到畫面,一直對應的 onStop() 出現時才會消失。

(3)當另一個 Activity 被執行時,目前的 Activity 就會自動進入 onPause() 暫停的狀態,並放棄螢幕存取權退到背景執行,但是 Activity 並未結束。在另一個 Activity 執行完成後,原來的 Activity 可以經由執行 onResume() 取回螢幕控制權,並回到程式暫停前的狀態。


3.系統記憶體不足時的資源移除順序:

(1)Empty Process:為獨立的 Activity。
(2)Background Activity:表示 Activity 已處於 onStop() 的狀態。
(3)Service Process:在背景執行的程序,如播放音樂、上傳/下載文件等。
(4)Visible Activity:應用程式處於 onPaused() 狀態時,原來的 Activity 仍屬於 Visible。
(5)Activity:當此 Activity 所需的記憶體大小超出系統所能提供時,系統則會取消此 Activity 的執行。


4.Activity 運作流程:

圖片來源:Android應用程式開發速成班


5.標準的機制通常將要儲存狀態的動作寫在 onPause() 方法中,回復狀態的動作寫在 onResume() 方法中。




十. 程式除錯及程式碼片段

1.Log 日誌檔語法:

Log. 代號(標籤, 輸出訊息);
PS:使用 Log 必須以「import android.util.Log」加入使用的套件。



十一. 資料的儲存

1.SharedPreferences 物件:建立、讀取資料、移除部分及全部資料。

2.SharedPreferences 儲存資料:

SharedPreferences 變數 = getSharedPreferences(檔名, 權限);

*檔名:儲存資料的檔案名稱。建立資料檔時只要輸入檔案名稱,不需指定副檔名。

*權限:MODE_PRIVATE、MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE。

PS:只能儲存 (key, value) 型式的資料,key 為資料的名稱;value 為資料的實際內容。


3.寫入 SharedPreference 物件的內容:

(1)取得 Editor 物件:
Editor 變數 = SharedPreferences 物件名稱.edit();

(2)以 putXXX 方法將資料寫入到儲存檔中:
Editor 物件名稱.putXXX(key, value);

*putBoolean、putFloat、putInt、putLong、putString

(3)呼叫 commit() 方法:
editor.commit();


4.SharedPreferences 讀取資料:
SharedPreferences 變數名稱.getXXX(key, default);


5.SharedPreferences 移除資料:

(1)單筆資料:
Editor 物件名稱.remove(key);
editor.commit();

(2)全部資料:
Editor 物件名稱.clear();
editor.commit();


6.寫入檔案資料:

FileOutputStream 物件 = openFileOutput(檔名, 權限);
BufferedOutputStream 物件 = new BufferedOutputStream(FileOutputStream 物件);
BufferedOutputStream buffout = new BufferedOutputStream(fout);
BufferedOutputStream 變數.write(字串, Bytes());
//資料寫入後即可以 close 方法關閉檔案
buffout.close();

*檔名:儲存資料的檔案名稱。可以指定副檔名,但不可指定儲存路徑,檔案儲存於系統內部指定位置中。

*權限:MODE_PRIVATE、MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE、MOED_APPEND。

*使用檔案方式存取資料時,必須將存取檔案的程式碼置於 try..catch 例外處理中,否則執行時會產生錯誤。
7.讀取檔案資料:

FileInputStream fin = openFileInput("test.txt");
BufferedInputStream buffin = new BufferedInputStream(fin);
byte[] buffbyte = new byte[20];
int length = buff in.read(buffbyte);
buffin.close();*使用檔案方式存取資料時,必須將存取檔案的程式碼置於 try..catch 例外處理中,否則執行時會產生錯誤。




十二. SQLite 資料庫


1.建立 SQLite 資料庫:

SQLiteDatabase 物件 = openOrCreateDatabase(檔名, 權限, null);

*檔名:建立的資料庫名稱,副檔名為 .db,也可以指定副檔名。

*權限:MODE_PRIVATE、MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE。


2.刪除 SQLite 資料庫:

deleteDabtbase("資料庫名稱.db");


3.SQLiteDatabase 類別:

(1)execSQL():執行 SQL 命令,可以完成資料表的建立、新增、修改、刪除動作。

(2)rawQuery():以 Cursor 型別傳回查詢的資料,最常用於查詢所有資料。

(3)insert():資料新增,使用時會以 ContentValues 類別將資料以打包的方式,再透過 insert() 新增至資料表中。

(4)delete():刪除指定的資料。

(5)update():修改資料,使用時會以 ContentValues 類別將資料以打包的方式,再透過 update() 更新資料表。

(6)query():以 Cursor 型別傳回指定欄位的資料。

(7)close():關閉資料庫。



這是個轉貼的文章。http://w1a2d3s4q5e6.blogspot.tw/2012/08/android.html
我也有一本同樣的書,但我覺得他整理的很好,我怕日後找不到,就乾脆存放一份囉。
以他的內容基礎修改我要的內容。

沒有留言:

TeraTerm是一款開放原始碼的遠程客戶端操作軟體

因為工作需求,有時我們需要從遠端登入某設備或是主機,又或者因為故障排除,需要透過serial port連入某設備進行檢查和操控。 偶然看到某SI的工程師,使用這個工具,想說也來使用看看。心中相信這應該是好工具,人家才會用它。 我自己通常都是簡單使用的話用 putty,想要用好一...