網頁

2014年10月26日 星期日

1.安裝node.js

1.apt-get install git
 
2.git clone git://github.com/creationix/nvm.git ~/.nvm

3.echo ". ~/.nvm/nvm.sh" >> ~/.bashrc

4.重新開始新的terminal或用source載入環境變數

5.nvm install v0.10   

nvm的全名為Node.js Version Management,使用nvm安裝node.js比起apt-get來得更方便,nvm安裝的版本可以自行修改,使用nvm ls可以查看所安裝的版本。



nvm run v0.10 node.js
使用nvm執行node.js,上面的node.js可以換成你node.js的檔名

2014年10月25日 星期六

Ubuntu NTP


  • 設定時區:dpkg-reconfigure tzdata

dpkg-reconfigure這個指令可以對一些已經安裝的套件做重新設定,如果用上面的指令還無法正確的更新時間的情況下,使用ntpdate進行更新時間的動作。

  • 設定時間:ntpdate time.stdtime.gov.tw


1.第一支JAVA程式

JAVA是一個物件導向的語言,因此許多人在學習JAVA的過程中覺得很困難,且因為JAVA物件導向等等的觀念,學習JAVA的人可能沒辦法一下接受太多的觀念,讓我們慢慢的學習JAVA吧。

public class Java { public static void main(String[] args) { System.out.println("hello world"); } }
JAVA是由許多的類別(class)組成的,如果你JAVA檔(Java.java)中只有一個類別名稱的話,這個類別必須與JAVA檔同名,因此上面範例中的類別為Java,通常撰寫類別的寫法為class 類別名稱,至於public將在後面再提到。撰寫完類別時還必須加上兩個大括號{},這兩個括號中可以撰寫方法變數等等。

範例中的main方法如同許多的程式語言一樣是一個程式開始的起點,public一樣在後面在提到,static指的是靜態的意思,也就是說只要有冠上static的方法或是物件,就不需要實體化之後再呼叫方法或物件,可以直接呼叫方法或物件,範例中的main方法因為是第一個開始的方法,所以不會有其他的程式碼能夠實體化main方法的類別,如果看不懂這裡的static的話,後續還會提到static的其他用法,不用拘泥於這裡。void指的是無回傳值,表示main方法執行完畢時不會回傳任何的值。最後是main方法中的引數String[] args,雖然這個引數不一定會用到,但是你還是必須打上去,不然你的JAVA程式是無法執行的喔!!方法撰寫完也還是必須加上兩個大括號{},可以撰寫一些陳述(Statement)

範例中的System.out.println("hello world")是一個很簡單的陳述,System.out.println的功能是能夠印出文字並且換行,如果不想換行的話可以改用System.out.print()

2014年10月6日 星期一

資訊登錄檔-滑鼠右鍵

1.增加資料夾滑鼠右鍵的功能表 :
HKEY_CLASSES_ROOT\Folder指的是Windows下的資料夾,因此在HKEY_CLASSES_ROOT\Folder\shell底下新增你所需要的機碼,舉例我新增的機碼為CMD且預設值自行定義為命令提示字元,這樣資料夾滑鼠右鍵的功能表就多了命令提是字元不過目前還沒有功能,最後要在你剛剛新增的機碼底下新增一個固定的機碼command預設值打上你所要執行的程式路徑名稱,我整個資訊登錄檔機碼的路徑為HKEY_CLASSES_ROOT\Folder\shell\CMD\command。


2.更換預設的工作管理員
Process Hacker比傳統的工作管理員提供更多的訊息給使用者,因此我將傳統的工作管理員替換成Process Hacker,不論是在工作列中滑鼠右鍵的工作管理員還是ctrl+shif+esc的工作管理員都希望能夠直接執行Process Hacker,要達成目的需要使用資訊登錄檔,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options是執行檔的映像路徑,如果底下的機碼沒有taskmgr.exe就自行新增此機碼,之後再新增字串值名稱為Debugger值則指定Process Hacker執行檔的路徑。

2014年9月9日 星期二

3.C#判斷式

C#判斷式是使用ifswitch為主,如果判斷的項目少的時候使用if較為恰當如果多則使用switch static void Main(String[] args){ int age = 16; if (age >= 18) { Console.WriteLine("成年"); Console.ReadKey(); } else { Console.WriteLine("未成年"); Console.ReadKey(); } }
上面的範例使用if判斷式判斷年紀是否為成年其結果為未成年,現在在增加一個判斷式項目判斷是否為青少年 static void Main(String[] args){ int age = 16; if (age >= 18) { Console.WriteLine("成年"); Console.ReadKey(); } else if (age < 18 && age >= 12) { Console.WriteLine("青少年"); Console.ReadKey(); } else { Console.WriteLine("小孩"); Console.ReadKey(); } }
執行後的結果為青少年。

switch判斷式使用case進行布林和數值的判斷,當確定是某個case的項目時,必須使用break中止switch,不然swtich會執行下一個case的項目,當所判斷的項目都不再case之中可以使用default顯示找不到符合的判斷。 static void Main(String[] args){ int choice = 1; switch (choice) { case 1: Console.WriteLine("A"); Console.ReadKey(); break; case 2: Console.WriteLine("B"); Console.ReadKey(); break; case 3: Console.WriteLine("C"); Console.ReadKey(); break; default: Console.WriteLine("不在選項中"); Console.ReadKey(); break; } }

2.C#變數和運算

C#是一個強類型的語言,所有的變數都必須要指定是什麼型態,變數是儲存資料的東西,變數的型態可能是字元、字串、數值等等。 static void Main(String[] args) { int i = 1, j = 2; //整數 float f = 1.2f; //單精準浮點數 double d = 3.14; //雙精準浮點數 char c = 'c'; //字元 string s = "hello"; //字串 bool b = true; //布林 }
C#用=指定變數和進行運算,int i = 1是將常數1指定到變數i,i的變數儲存的資料就為1。不過程式語言的=並不等於數學的=,像是i = i + 1在數學公式中是不成立的兩邊的值並不相等,i的值加1之後為2,i變數最後儲存的值為2。

C#的運算順序與數學的運算順序一樣先乘除後加減,例如X = 2 * 3 + 4 / 2,X的值為8。

C#也支援位元運算、邏輯運算、遞增運算,位元運算使用<<>>符號分別代表向左位移和向右位移,例如int i = 1; i = i << 2 結果為4,因為做位元運算時會將值轉為2進位,1的二進位為00000001向左位移2位之後為00000100為4,右邊移位以此類推。邏輯運算使用!(NOT)&(AND)|(OR)來判斷是否為true或false或對數值進行邏輯運算。遞增運算通常用於迴圈使每一次執行加一或減一,i++、++i、i--、--i遞增運算的符號前後是有差的,如果遞增運算在前面的話,在進行運算式時會先執行遞增運算在計算運算式,如果在後面時會先計算運算式在進行遞增運算。

1.第一個C#程式

using System; namespace learn { class HelloWorld { static void Main(string[] args) { Console.WriteLine("Hello World"); //印出Hello World Console.ReadKey(); } } }
上面的程式碼是由C#主控台(Console)的專案所撰寫的,主控台程式必須包含Main方法,Main方法是程式開始的起始點

Main方法是位於類別內的方法,在上面的範例中類別是HelloWorld,因此Main方法位於HelloWorld類別內,Main方法的寫法不止一種,上面範例中的Main方法寫法是static void Mainvoid表示方法為無回傳值,最基本的Main方法寫法如下:

static void Main() { }
當然也可以設為有回傳值,底下的範例將Main方法設為整數回傳值 static int Main() { return 0; }

在Main方法中除了可以設定回傳值之外,也可以使用引數 static void Main(String[] args) { }
或是 static int Main(String[] args) { return 0; }
不論是有無回傳值都可以使用引數

Console.WriteLine是用來當作資料輸出,WriteLineConsole類別輸出資料的其中一種,Console類別是System的子類別,因為第一個範例有使用using System所以可以使用System的類別和方法,如果沒有使用using System則要使用完整的寫法System.Console.WriteLine

C#的註解有兩種方式一種是使用//另一種是用/**/,另如//我是註解或是/*我是註解*///用於單行/**/用於多行或區塊

Console.ReadKey是提供輸入資料使用,為了能讓第一個範例顯示結果,使用Console.ReadKey等待使用者輸入,有如暫停的功能,第一個範例就會輸出Hello World。

2014年8月31日 星期日

pwd

pwd(print name of current/working directory)顯示目前所在的目錄

參數如下:

-P : 顯示實際路徑
-L : 顯示連接(Link)路徑

ls

ls(list directory contents)是用來顯示所在目錄的檔案,常用的指令參數ls -l ls -al

一些參數如下:
-a : 顯示所有的檔案包含隱藏檔
-A :  顯示所有的檔案包含隱藏檔,但不包含.跟..
-h : 檔案容量以人類可以易讀的方式呈現(KB,MB,GB)




cd

cd(Change Directory)是用來轉換目錄的指令,他主要的指令有以下幾個:

cd : 回到家目錄
cd ~ : 回到家目錄
cd / : 轉移到系統的根目錄
cd /home : 轉移到系統的/home目錄(home目錄存放使用者的家目錄)
cd /root : 轉移到/root目錄
cd .. :移動到上一層目錄
cd  ~user : 轉移到某位使用者的家目錄(例如cd ~golden)
cd - : 回到前一次的目錄
cd !$ : 將上一次的指令作為最後的輸入
例如:
#ls /Desktop
#cd !$
cd !$會將/Desktop當作輸入的參數,所以會變成cd /Desktop

cd指令還有分為絕對目錄相對目錄

絕對目錄cd /user/Desktop,如果要轉移到Music可以用絕對目錄cd /user/Music或是相對目錄../Music


2014年8月28日 星期四

XPE燒入到隨身碟

1.將隨身碟或外接式硬碟格式化為NTFS


2.使用BOOTICE



3.目標磁片選擇要安裝XPE的隨身碟,並且按下主引導記錄


4.接下來會到下圖的畫面並且根據下圖的選項進行安裝/配置



5.按下UltraISO USB-HDD+完成主引導記錄










6.在第2步驟按下分區引導記錄


並選擇NTLDR引導程式,在按下安裝/配置


最後按下確定完成分區引導記錄



7.在步驟2中,按下分區管理


在按下啟動,就大功告成了


2014年7月30日 星期三

12.Android的getText()方法

在我撰寫Andorid的時候,有時程式的功能會需要取得ButtonTextViewEditText等等元件的內容,一般會認為getText()這個方法所回傳的類型是String,但是情況卻不是這樣,參考下面錯誤的範例:

Button btn = (Button) findViewById(R.id.btn);
String str = btn.getText();

這樣的寫法看似正確,但是getText()並不是回傳String的型別,因此需要加上toString()的方法強制轉型為String,將上面的範例改為正確如下:


Button btn = (Button) findViewById(R.id.btn); String str = btn.getText().toString();

2014年7月26日 星期六

10.Android的Widget之輸入類別

Android提供EditText供使用者輸入資料,EditText所撰寫的方法非常的簡單,而它的屬性也很好理解,android:hint用來設定EditText提示的文字,android:password用來設定輸入的內容是否隱藏起來,參考下面的範例。 <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="帳號" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:password="true" android:hint="密碼" />
執行結果:

輸入後的結果:
AutoCompleteTextView同樣也是能夠給使用者輸入資料,不過它能夠提供自動提示的輸入功能,例如當輸入a的時候就會跑出apple、address、alert等等的提示,下面是xml檔和執行的結果圖。
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="你最喜歡的程式語言是什麼?" /> <AutoCompleteTextView android:id="@+id/autoCompleteTextView" android:layout_width="match_parent" android:layout_height="wrap_content" />
AutoCompleteTextView要有自動提示的文字必須要自己手動加入,這些文字可以在xml檔加入也可以在程式碼當中加入,下面是程式碼範例:
import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.*; public class MainActivity extends Activity { final String[] language = {"C","C++","C#","Java","VB","JSP","Android","ASP.NET","PHP","Python"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item,language); AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) findViewById (R.id.autoCompleteTextView); autoCompleteTextView.setThreshold(1); autoCompleteTextView.setAdapter(adapter); } }
上面的程式範例中將想顯示的自動提示放入陣列中,並使用ArrayAdapter進行實作,ArrayAdapter能夠儲存字串陣列並且放入Android的List物件,最後setThreshold這個屬性是用來設定輸入多少字元會出現提示的文字,在範例中設定的值是1,因此輸入第一個字元之後就會有提示的文字,setAdapter是用來設定使用哪個ArrayAdapter

MultiAutoCompleteTextViewAutoCompleteTextView都具有自動提示的功能,不同的地方是允許多個值可以自動提示的功能,程式的寫法與AutoCompleteTextView差不多,不過加入了一個分隔符號的屬性setTokenizer設定每個值之間的分隔符號。
new MultiAutoCompleteTextView.CommaTokenizer()是指英文的,號當作MultiAutoCompleteTextView的分隔符號,下面是程式碼範例與結果圖:



xml檔:
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="你最喜歡的程式語言是什麼?" /> <MultiAutoCompleteTextView android:id="@+id/multiAutoCompleteTextView" android:layout_width="match_parent" android:layout_height="wrap_content" />

程式碼: import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.*; public class MainActivity extends Activity { final String[] language = {"C","C++","C#","Java","VB","JSP","Android","ASP.NET","PHP","Python"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item,language); MultiAutoCompleteTextView multiAutoCompleteTextView = (MultiAutoCompleteTextView) findViewById (R.id.multiAutoCompleteTextView); multiAutoCompleteTextView.setThreshold(1); multiAutoCompleteTextView.setAdapter(adapter); multiAutoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); } }

除了上面介紹了這些輸入的類別之外Android還提供下拉式選單spinner,寫法跟前面所介紹的差不多,非常的簡單使用。

xml檔: <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="你最喜歡的程式語言是什麼?" /> <Spinner android:id="@+id/spinner" android:layout_width="match_parent" android:layout_height="wrap_content" />

主程式:
import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.*; public class MainActivity extends Activity { final String[] language = {"C","C++","C#","Java","VB","JSP","Android","ASP.NET","PHP","Python"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,language); Spinner spinner = (Spinner) findViewById(R.id.spinner); spinner.setAdapter(adapter); } }

9.Android的Widget之按鈕

Android在android.widget.view底下有許多的元件提供使用者開發,一開始先介紹常用的按鈕ButtonImageButton。Android中的ButtonImageButton都能夠顯示圖片,不過這兩者還是有差別的,請看下面的範例。 <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:drawableLeft="@drawable/ic_launcher" android:onClick="function" /> <ImageButton android:id="@+id/imgBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" />
範例中Buttonandroid:drawableLeft是設定按鈕的圖案,因為Buttonandroid:text屬性有設定文字,因此圖案會往左移動,因此Button會同時顯示圖案和文字,而ImageButton則無法同時顯示圖案和文字,ImageButton是用android:src設定按鈕的圖案,最後這兩個元件都能設定android:onClick來指定程式當中的事件,執行的結果如下。


接下來要介紹ToggleButton,看到這個元件的名稱就可以知道是用來開啟或關閉等等的功能,這個元件主要要設定的是開啟或關閉的文字,分別是android:textOnandroid:textOff這兩個屬性設定文字,下面是xml檔的範例和執行的結果。

<ToggleButton android:id="@+id/toggleButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textOn="on" android:textOff="off" />

CheckBox也是非常常用到的功能按鈕,它能夠提供單選或是複選的功能,它在xml檔中的寫法與前面介紹的按鈕並沒有差別,因此可以直接參考xml檔和執行圖。
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="喜歡的活動:" /> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="電影" /> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="旅遊" /> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="逛街" /> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="運動" />

RadioButtonCheckBox有點類似,但不同的地方在於RadioButton只支援單選,但要使用RadioButton的單選需要RadioGroup配合,不然除了每一個RadioButton都能夠被選擇以外,還無法取消掉所選的選項,最後android:checked是設定是否程式一執行就被勾選,下面是xml檔與執行的結果。
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="請選擇性別:" /> <RadioGroup android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="男" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="女" /> </RadioGroup>

2014年7月25日 星期五

8.Android之Intent

之前有說過一個Android的畫面就是一個Activity,在日後開發Android的時候不可能都只有使用一個Activity,因此需要使用Intent這個物件,假設有兩個Activity分別為ABAActivity可以利用Intent跳到BActivity

下面這兩張圖片範例分別是AActivityBActivity,當按下AActivitySend按鈕就會跳到BActivity

A的Activity
B的Activity

A的Activity程式碼如下:
import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.*; import android.view.*; import android.content.*; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener(){ public void onClick(View view) { Intent intent = new Intent(MainActivity.this,ActivityB.class); startActivity(intent); } }); }
在這段程式碼中首先先實體化Button物件並找到在Layout中所定義的ButtonID,接下來定義Button按鈕事件並覆寫onClick方法,最後在實體化Intent,在這個例子中Intent需要兩個參數,從哪個Activity到個Activity,因此分別輸入所需的ActivitystartActivity會讓Intent跳到下一個Activity

Intent還有許多的用法,待續...

2014年7月24日 星期四

2.C語言資料型態

C語言的資料型態有字元整數浮點數。這些資料的型態方便提供使用者設定變數,每種資料型態所佔用的記憶體大小和資料範圍會不太一樣,所佔用記憶體的大小會跟所使用的編譯器有關係,下面是各種資料型態的表示方法和資料大小的範圍。

字元:
  • char -128 ~ 127
整數:
  • int -2147483648 ~ 2147483647
  • short : -32768 ~ 32767
  • long : -2147483648 ~ 2147483647
  • long long
浮點數:
  • float10^-38~10^38
  • double 10^-308~10^308

另外C語言的整數型態包含了正整數和負整數,可以使用 signedunsigned分別設定設定整數型態為有正負號和無正負號,例如unsigned int為無正負號 ,因為原來的整數型態就有包含正負號了,因此不用在用signed進行設定,下面的範例是顯示資料型態所佔用的位元組大小。
#include<stdio.h> int main(void) { printf("%s%ld\n","char:",sizeof(char)); printf("%s%ld\n","int:",sizeof(int)); printf("%s%ld\n","short:",sizeof(short)); printf("%s%ld\n","long:",sizeof(long)); printf("%s%ld\n","long int:",sizeof(long int)); printf("%s%ld\n","long long:",sizeof(long long)); printf("%s%ld\n","float:",sizeof(float)); printf("%s%ld\n","double:",sizeof(double)); printf("%s%ld\n","unsigned int:",sizeof(unsigned int)); printf("%s%ld\n","unsigned char:",sizeof(unsigned char)); printf("%s%ld\n","unsigned short:",sizeof(unsigned short)); printf("%s%ld\n","unsigned long:",sizeof(unsigned long)); printf("%s%ld\n","unsigned long long:",sizeof(unsigned long long)); return 0; }
C語言在輸入輸出中有對應的輸入輸出格式,資料型態都會有對應的輸入輸出格式:
  • %d : 十進位整數
  • %o : 八進位整數
  • %x : 十六進位整數,超過10的數字以小寫表示,例如0xf
  • %X : 十六進位整數,超過10的數字以大寫表示,例如0xF
  • %u : 不帶符號的十進位整數
  • %c : 輸出字元
  • %s : 輸出字串
  • %e : 使用科學記號,e為小寫
  • %E使用科學記號,E為小寫
  • %ld: 長整數十進位整數
  • %f : 輸出浮點數

簡略的範例如下:
#include<stdio.h> int main(void) { printf("%d\n",10); printf("%f\n",10.0); printf("%c\n",'a'); return 0; }

7.Activity生命週期

Android的Activity是具有生命週期的,我們撰寫Android時,在Eclipse裡新增一個Activity裡有onCreate方法,這個onCreate就是Android生命週期當中的其中一種,請參考下面兩張Android生命週期的圖。



根據上面的我們可以知道Activity有許多的生命週期方法,將這些方法整理出來如下:
  • onCreate
  • onStart
  • onRestart
  • onResume
  • onPause
  • onStop
  • onDestroy

當程式執行時會先呼叫方法的順序為onCreate->onStart->onResume,接著在你的裝置上按下回主頁的畫面時呼叫的方法順序為onPause->onStop,再從主畫面切回之前被暫停的程式所發生的事件為onRestart->onStart->onResume,最後如果要結束程式按下返回鍵就可以了,執行方法的順序為onPause->onStop->onDestory


2014年7月16日 星期三

1.C語言基礎介紹

下面是C語言的hello world範例:

#include<stdio.h> int main(void) { printf("hello world"); return 0; }
執行之後的結果會顯示hello world的文字。

現在來看第一行的程式碼#include<stdio.h>#是C語言的一種前置處理,C語言再執行時會先執行前置處理再執行程式碼。include是指要導入的檔案,這個include是C語言標準函數庫中的標頭檔,主要提供C語言基本輸入、輸出的功能。

接下來看int main(void)這段程式碼,C語言程式是由main函式為程式執行的起點,將所想寫的程式寫在{}內就可以了。而函式可以有傳回值和無傳回值,int再C語言中是數值的型態,因此main函式需要一個數值的傳回值,void可以表達兩種意思,一種可以代表是函式為無傳回值,另一種表示為無參數,上面範例的main函式參數是main表示沒有參數的意思。

程式碼當中的printf()是一個函數,它的功能是將資料輸出到螢幕上,在上面的範例中是輸出hello world,最後一個是return是C語言的關鍵字,功能是函式結束所回傳的值,因為main函式是int數值類型,所以最後的回傳值是0這個數值,0也代表程式成功執行結束的意思。

2014年7月13日 星期日

6.AbsoluteLayout

AbsoluteLayout是一個非常好學的Layout,但是不太會用,因為如果用絕對定位的方式定義元件的座標的話,不同手機的螢幕大小可能會導致你所設計的AbsoluteLayout排版產生問題,AbsoluteLayout主要有兩個功能:

  • android:layout_x:指定元件的x軸
  • android:layout_y:指定元件的y軸

AbsoluteLayout的xml範例:
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="10px" android:layout_y="20px" android:text="進入" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="380px" android:layout_y="20px" android:text="離開" /> </AbsoluteLayout>
很簡單吧!!

5.ActionBar

Android的ActionBar是一個很難搞的東西,除了版本的問題之外還有實體按鈕的MENU問題,導致我在摸索的時候花了很長的時間才了解問題的所在。



上面第一張圖的3,在ActionBar中稱為Overflow,請參考第二張圖,這個Overflow也是問題的所在,因為在我寫好的Android程式執行之後完全找不到Overflow,問題的原因經過不斷的在網路上爬文找的答案是,如果你的機器上有MENU的按鈕則不會顯示Overflow,如果沒有才會顯示,因此Overflow只是給沒有MENU的機器所使用的

在預設的Android中按MENU只會跳出Settings的MENU選項而已,這邊舉個例子增加MENU的選項,在res/menu目錄中找到你主要Activity的xml檔,以我的檔案為例,我的xml檔案名稱叫做main.xm,參考下面的範例:

main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.golden.lab.MainActivity" > <item android:id="@+id/action_help" android:title="@string/action_help" android:icon="@drawable/ic_action_help" android:showAsAction="ifRoom" /> <item android:id="@+id/action_settings" android:orderInCategory="100" android:title="@string/action_settings" android:showAsAction="always" /> </menu>
上面的範例main.xml新增了一個help的MENU,android:id是物件的名稱,為了撰寫程式所使用,在後面會提到。android:title是指在MENU中顯示的文字,因為有@string因此會參考到res/values/strings.xml,必須在裡面新增help文字。android:icon是提供MENU圖案的功能,不過我目前還是沒有成功就是了,Android有提供Action Bar Icon Pack提供使用者下載或是使用者也可以加入自己想要的icon圖案,只要將icon圖案加入到res/drawable每個解析度底下就可以使用了。最後android:showAsAction的功能有一些參數我列在下面:

  • ifRoom - 如果有ActionBar有空間的話會就會顯示item出來
  • withText - 顯示item的文字,可以搭配|來使用,例如ifRoom|withText
  • never - 不會顯示在ActionBar上面
  • always - 總是顯示在ActionBar上面,但官方的文件說不建議這樣做
現在已經在MENU中新增了help選項了,但是需要在Activity主程式中加入,但是因為我使用的Eclipse已經幫我做到這一點了,我就不需要再做這個動作了。

MainActivity.java
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }
不過網路上有不少人這樣寫:
public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return true; }
這兩者的寫法都可以產生MENU,要撰寫目錄的事件方法必須在onCreateOptionsMenu裡撰寫,MenuInflater是用來定義MENU用的,MenuInflater.inflate用來指定是哪個MENU。

最後我們將menu中的action_setting的android:showAsAction屬性改成never,再將action_help的android:showAsAction屬性改always使得action_help的icon能夠出現。

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.golden.lab.MainActivity" > <item android:id="@+id/action_help" android:title="@string/action_help" android:icon="@drawable/ic_action_help" android:showAsAction="always" /> <item android:id="@+id/action_settings" android:orderInCategory="100" android:title="@string/action_settings" android:showAsAction="never" /> </menu>




新增Item事件


目前已經完成新增MENU的項目了,但是點下所新增的help項目沒有任何的反應,因此接下來的動作必須新增help的事件動作。要新增item的事件動作必須在onOptionsItemSelected裡進行撰寫,設定按下help跳到另一個Activity。

MainActivity.java public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.action_help: Help(); return true; case R.id.action_settings: return true; default: return super.onOptionsItemSelected(item); } } private void Help() { Intent intent = new Intent(this,Help.class); startActivity(intent); } }
在上面的onOptionsItemSelected函數中可以看到使用switch來判斷是按下哪一個item,如果是按下help則會呼叫Help()方法,Help()方法中使用Intent切換到另一個Activity,因此還必須新增一個help.java的Activity。

MainActivity.java畫面
按下help到help.java的畫面






返回Activity畫面


雖然上圖help的Activity有一個左邊的箭頭可以返回到main的Activity,但是實際上在我的手機上面沒有,因此接下來的動作要在help的Activity加上返回的動作。 public class Help extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_help); ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.help, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.action_settings: return true; case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; default: return super.onOptionsItemSelected(item); } } }
使用actionBar.setDisplayHomeAsUpEnabled就可以讓ActionBar顯示返回的箭頭,但是不會返回到main的Activity,因此還必須在onOptionsItemSelected函數中加入android.R.id.home進行判斷,且利用NavUtils.navigateUpFromSameTask返回到主頁。




更換ActionBar icon和隱藏ActionBar


要更換ActionBar的icon很簡單,只需要一段文字actionBar.setIcon,指定好icon圖案就可以,接下來修改help的Activity來更換icon圖案,下面是範例。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_help); ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setIcon(R.drawable.help); }
從上面的圖可以看到icon已經被我換成自己所設定的了,除了主程式裡面可以更換icon還可以利用AndroidManifest.xml來進行設定,AndroidManifest.xml當中的<activity></activity>可以設定icon和ActionBar的標題,每一個<activity></activity>代表的是不同的Activity,因此可以根據不同的Activity畫面設定不同的icon,下面是範例:
<activity android:name=".MainActivity" android:label="Android" android:logo="@drawable/help" > </activity> android:label是設定ActionBar的標題,android:logo是設定ActionBar的icon ,如果要統一設定每個Activity的ActionBar的標題和icon在AndroidManifest.xml<application></application>進行設定,請參考下面的範例:
<application android:allowBackup="true" android:icon="@drawable/help" android:label="@string/app_name" android:theme="@style/AppTheme" > </application> 設定每個Activity的icon和標題分別是android:iconandroid:label,很簡單吧!!
 
ActionBar還有提供一個功能就是隱藏ActionBar,也是一樣只要一段文字就可以達成,actionBar.hide指的是將ActionBar隱藏起來,下面的範例一樣是針對help的Activity進行修改。 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_help); ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setIcon(R.drawable.help); actionBar.hide(); }
可以看到ActionBar完全消失了,如果要顯示ActionBar只要使用actionBar.show就可以了

待續...

2014年7月12日 星期六

4.TableLayout

TableLayout是一個類似表格排列方式的layout,TableLayout使用TableRow將內容分行,TableLayout主要的功能有下面這幾個項目:

  • android:stretchColumns:將指定的欄位填滿剩餘的空間,可以用*代表是全部的欄位
  • android:shrinkColumns:將指定的欄位縮小空間,可以用*代表是全部的欄位
  • android:collapseColumns:將指定的欄位進行刪除
上面這些設定有一個地方是需要值得注意的欄位的編號是從0開始計算的,下面是TableRow中的功能:
  • android:layout_span:合併欄位的格數
  • android:layout_column:指定欄位的編號


下面是一些TableLayout的xml範例:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:stretchColumns="*" > <TableRow> <TextView android:text="帳號:" android:padding="10px" /> <EditText android:padding="10px" android:layout_span="2" /> </TableRow> <TableRow> <TextView android:text="密碼:" android:padding="10px" /> <EditText android:padding="10px" android:layout_span="2" /> </TableRow> <TableRow> <Button android:text="登入" /> <Button android:text="取消" /> <Button android:text="註冊" /> </TableRow> </TableLayout>

上面這個範例android:stretchColumns="*"因為被設為是*號,因此影響了全部的欄位,全部的欄位都會填滿剩餘的空間,下面這個範例指定一個欄位來比較有什麼不同。
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:stretchColumns="0" > <TableRow> <TextView android:text="帳號:" android:padding="10px" /> <EditText android:padding="10px" android:layout_span="2" /> </TableRow> <TableRow> <TextView android:text="密碼:" android:padding="10px" /> <EditText android:padding="10px" android:layout_span="2" /> </TableRow> <TableRow> <Button android:text="登入" /> <Button android:text="取消" /> <Button android:text="註冊" /> </TableRow> </TableLayout>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:shrinkColumns="*" > <TableRow> <TextView android:text="帳號:" android:padding="10px" /> <EditText android:padding="10px" android:layout_span="2" /> </TableRow> <TableRow> <TextView android:text="密碼:" android:padding="10px" /> <EditText android:padding="10px" android:layout_span="2" /> </TableRow> <TableRow> <Button android:text="登入" /> <Button android:text="取消" /> <Button android:text="註冊" /> </TableRow> </TableLayout>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:collapseColumns="0" > <TableRow> <TextView android:text="帳號:" android:padding="10px" /> <EditText android:padding="10px" android:layout_span="2" /> </TableRow> <TableRow> <TextView android:text="密碼:" android:padding="10px" /> <EditText android:padding="10px" android:layout_span="2" /> </TableRow> <TableRow> <Button android:text="登入" /> <Button android:text="取消" /> <Button android:text="註冊" /> </TableRow> </TableLayout>

2014年7月11日 星期五

3.RelativeLayout

RelativeLayout顧名思義就是相對位置的layout,這種layout中的元件需要設定所指定的元件才能進行排列,下面是RelativeLayout常用的功能。

  • android:layout_below:在所指定的元件下方
  • android:layout_above:在所指定的元件上方
  • android:layout_toLeftOf:在所指定的元件左方
  • android:layout_toRightOf:在所指定的元件右方
  • android:layout_alignTop:與所指定元件的上邊緣對齊
  • android:layout_alignBottom:與所指定元件的下邊緣對齊
  • android:layout_alignLeft:與所指定元件的左邊緣對齊
  • android:layout_alignRight:與所指定元件的右邊緣對齊
  • android:layout_alignBaseLine:與指定元件的文字在同一水平上
  • android:layout_alignParentRight:是否將此元件對齊於畫面右方的邊緣
  • android:layout_alignParentLeft:是否將此元件對齊於畫面右左方的邊緣
  • android:layout_alignParentTop:是否將此元件對齊於畫面上方的邊緣
  • android:layout_alignParentBottom:是否將此元件對齊於畫面下方的邊緣
  • android:layout_centerInParent:是否將此元件設定在畫面的正中間
  • android:layout_centerVertical:是否將此元件設定在畫面的垂直中間
  • android:layout_centerHorizontal:是否將此元件設定在畫面的水平中間

下面是RelativeLayout的xml範例和結果圖:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/label" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="輸入帳號和密碼:" /> <EditText android:id="@+id/inputAccount" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/label" android:hint="帳號" /> <EditText android:id="@+id/inputPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/inputAccount" android:hint="密碼" /> <Button android:id="@+id/btnCancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/inputPassword" android:layout_alignParentRight="true" android:layout_marginLeft="10px" android:text="取消" /> <Button android:id="@+id/btnLogin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@+id/btnCancel" android:layout_alignTop="@+id/btnCancel" android:text="登入" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="註冊" /> </RelativeLayout>

2.Android程式基礎介紹

在開始撰寫Android之前必須先了解Android的架構,從Eclipse中新增一個新的Android專案馬上就可以執行了,而這背後的運作是由許多的檔案所組成的!!

在專案中的src目錄底下就是Android主程式的檔案也就是一個Activity,所需要撰寫的程式碼就是在這裡。而每個Activity都有各自的Layout互相對應,Layout是一個xml檔放在res/layout底下,可以供使用者排版。

另外在目錄中可以看到AndroidManifest.xml,每一個Android都有這個檔案,這個檔案對於Android是相當重要的,許多相關的設定資訊都在這裡面。

待續...

1.LinearLayout

這個Layout最主要的地方需要注意的屬性是android:orientation,屬性值分別為horizontal(水平)和vertical(垂直),下面先介紹horizontal的範例。

horizontal的xml範例程式碼:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="3" /> </LinearLayout>
android:layout_widthandroid:layout_height的功能是指設定Android元件的寬度與高度,他的屬性有3個,分別是fill_parentmatch_parentwrap_contentfill_parentmatch_parent兩個值都是將大小擴展到最大的寬度與高度,這兩個值其實沒有什麼不同,只是在官方文件中指出match_parent將會取代fill_parent,當然fill_parent還是可以持續的使用,官方文件參考網址在這裡wrap_content這個值是將元件的大小根據元件中的內容適當的分配寬度和高度。

vertical的xml範例程式碼: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="3" /> </LinearLayout>

除了使用android:layout_widthandroid:layout_height設定寬度與高度以外,還可以使用權重值的方式來設定,android:layout_weight這個功能是用來設定權重值,權重值越高元件所佔的範圍會越大,參考下面的範例程式碼:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <EditText android:layout_weight="2" android:layout_width="0dp" android:layout_height="wrap_content" /> <Button android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" android:text="Submit" /> </LinearLayout>
根據Android官方文件的教學,如果有設定權重值的話,需要將寬或高設為0dp,而每個元件預設的權重值是0。


上面的方法都只是單純的使用水平或垂直的方式加入元件,用上面的方法沒有辦法排列成下面這張圖的Layout。

要形成這樣的Layout請參考下面的xml檔:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" <EditText android:layout_weight="2" android:layout_width="0dp" android:layout_height="wrap_content" /> <Button android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" android:text="Submit" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" <EditText android:layout_weight="2" android:layout_width="0dp" android:layout_height="wrap_content" /> <Button android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" android:text="Submit" /> </LinearLayout> </LinearLayout>