[轉貼]常用的PHP正規表示式

 

轉貼自:http://mro-php.blogspot.com/2009/10/php_19.html
很感謝大大的整理,有些還蠻實用的

 

“^\d+$” //非負整數(正整數+ 0)
“^[0-9]*[1-9][0-9]*$” //正整數
“^((-\d+)|(0+))$” //非正整數(負整數+ 0)
“^-[0-9]*[1-9][0-9]*$” //負整數
“^-?\d+$” //整數
“^\d+(\.\d+)?$” //非負浮點數(正浮點數+ 0)
“^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\ .[0-9]+)|([0-9]*[1-9][0-9]*))$” //正浮點數
“^((-\d+(\.\d+)?)|(0+(\.0+)?))$” //非正浮點數(負浮點數+ 0)
“^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9] *\.[0-9]+)|([0-9]*[1-9][0-9]*)))$” //負浮點數//OSPHP.COm.CN
“^(-?\d+)(\.\d+)?$” //浮點數
“^[A-Za-z]+$” //由26個英文字母組成的字符串
“^[AZ]+$” //由26個英文字母的大寫組成的字符串
“^[az]+$” //由26個英文字母的小寫組成的字符串
“^[A-Za-z0-9]+$” //由數字和26個英文字母組成的字符串
“^\w+$” //由數字、26個英文字母或者下劃線組成的字符串
“^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$” //email地址
“^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$” // url
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1- 9]{1}))|(3[0|1]))$/ //年-月-日
/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0 |1]))/(d{2}|d{4})$/ //月/日/年
“^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|( ([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$” //Emil //OSPHP.COm .CN
/^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?( [0-9]{7,8})(\-[0-9]+)?$/ //電話號碼
“^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0- 5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[ 0-5])$” //IP地址

匹配中文字符的正則表達式: [\u4e00-\u9fa5]
匹配雙字節字符(包括漢字在內):[^\x00-\xff]
匹配空行的正則表達式:\n[\s| ]*\r
匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正則表達式:(^\s*)|(\s*$)
匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配網址URL的正則表達式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*)) *(\\?\\S*)?$
//開源代碼OSPhP.COm.CN

匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
匹配國內電話號碼:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?
匹配騰訊QQ號:^[1-9]*[1-9][0-9]*$

元字符及其在正則表達式上下文中的行為:

\將下一個字符標記為一個特殊字符、或一個原義字符、或一個後向引用、或一個八進制轉義符。

^匹配輸入字符串的開始位置。如果設置了RegExp對象的Multiline屬性,^也匹配’\n’或’\r’之後的位置。

$匹配輸入字符串的結束位置。如果設置了RegExp對象的Multiline屬性,$也匹配’\n’或’\r’之前的位置。

*匹配前面的子表達式零次或多次。

+匹配前面的子表達式一次或多次。 +等價於{1,}。

?匹配前面的子表達式零次或一次。 ?等價於{0,1}。

{n} n是一個非負整數,匹配確定的n次。

{n,} n是一個非負整數,至少匹配n次。

{n,m} m和n均為非負整數,其中n <= m。最少匹配n次且最多匹配m次。在逗號和兩個數之間不能有空格。

?當該字符緊跟在任何一個其他限制符(*, +, ?, {n}, {n,}, {n,m})後面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。

.匹配除”\n”之外的任何單個字符。要匹配包括’\n’在內的任何字符,請使用象'[.\n]’的模式。
(pattern)匹配pattern並獲取這一匹配。

(?:pattern)匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以後使用。

(?=pattern)正向預查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。

(?!pattern)負向預查,與(?=pattern)作用相反

x|y匹配x或y。

[xyz]字符集合。

[^xyz]負值字符集合。

[az]字符範圍,匹配指定範圍內的任意字符。

[^az]負值字符範圍,匹配任何不在指定範圍內的任意字符。

\b匹配一個單詞邊界,也就是指單詞和空格間的位置。

\B匹配非單詞邊界。

\cx匹配由x指明的控製字符。

\d匹配一個數字字符。等價於[0-9]。

\D匹配一個非數字字符。等價於[^0-9]。

\f匹配一個換頁符。等價於\x0c和\cL。

\n匹配一個換行符。等價於\x0a和\cJ。

\r匹配一個回車符。等價於\x0d和\cM。

\s匹配任何空白字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。

\S匹配任何非空白字符。等價於[^ \f\n\r\t\v]。
//開源代碼OSPhP.COm.CN

\t匹配一個製表符。等價於\x09和\cI。

\v匹配一個垂直製表符。等價於\x0b和\cK。

\w匹配包括下劃線的任何單詞字符。等價於’[A-Za-z0-9_]’。

\W匹配任何非單詞字符。等價於’[^A-Za-z0-9_]’。

\xn匹配n,其中n為十六進制轉義值。十六進制轉義值必須為確定的兩個數字長。

\num匹配num,其中num是一個正整數。對所獲取的匹配的引用。

\n標識一個八進制轉義值或一個後向引用。如果\n之前至少n個獲取的子表達式,則n為後向引用。否則,如果n為八進制數字(0-7),則n為一個八進制轉義值。

\nm標識一個八進制轉義值或一個後向引用。如果\nm之前至少有is preceded by at least nm個獲取得子表達式,則nm為後向引用。如果\nm之前至少有n個獲取,則n為一個後跟文字m的後向引用。如果前面的條件都不滿足,若n和m均為八進制數字(0-7),則\nm將匹配八進制轉義值nm。 //PHP開源代碼

\nml如果n為八進制數字(0-3),且m和l均為八進制數字(0-7),則匹配八進制轉義值nml。

\un匹配n,其中n是一個用四個十六進制數字表示的Unicode字符。

匹配中文字符的正則表達式: [u4e00-u9fa5]

匹配雙字節字符(包括漢字在內):[^x00-xff]

匹配空行的正則表達式:n[s| ]*r

匹配HTML標記的正則表達式:/<(.*)>.*|<(.*) />/

匹配首尾空格的正則表達式:(^s*)|(s*$)

匹配Email地址的正則表達式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

匹配網址URL的正則表達式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

利用正則表達式限製網頁表單裡的文本框輸入內容:

用正則表達式限制只能輸入中文:onkeyup=”value=value.replace(/[^u4E00-u9FA5]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘ text’).replace(/[^u4E00-u9FA5]/g,”))”

用正則表達式限制只能輸入全角字符: onkeyup=”value=value.replace(/[^uFF00-uFFFF]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData( ‘text’).replace(/[^uFF00-uFFFF]/g,”))” 

用正則表達式限制只能輸入數字:onkeyup=”value=value.replace(/[^d]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’ ).replace(/[^d]/g,”))”

用正則表達式限制只能輸入數字和英文:onkeyup=”value=value.replace(/[W]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,c
lipboardData.getData(‘text ‘).replace(/[^d]/g,”))”

匹配中文字符的正則表達式: [\u4e00-\u9fa5]

匹配雙字節字符(包括漢字在內):[^\x00-\xff]

匹配空行的正則表達式:\n[\s| ]*\r

匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/

匹配首尾空格的正則表達式:(^\s*)|(\s*$)

匹配IP地址的正則表達式:/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //

匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配網址URL的正則表達式:http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

sql語句:^(select|drop|delete|create|update|insert).*$

1、非負整數:^\d+$

2、正整數:^[0-9]*[1-9][0-9]*$

3、非正整數:^((-\d+)|(0+))$

4、負整數:^-[0-9]*[1-9][0-9]*$

5、整數:^-?\d+$

6、非負浮點數:^\d+(\.\d+)?$

7、正浮點數:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0- 9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

8、非正浮點數:^((-\d+\.\d+)?)|(0+(\.0+)?))$

9、負浮點數:^(-((正浮點數正則式)))$

10、英文字符串:^[A-Za-z]+$

11、英文大寫串:^[A-Z]+$

12、英文小寫串:^[a-z]+$

13、英文字符數字串:^[A-Za-z0-9]+$

14、英數字加下劃線串:^\w+$

15、E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$

16、URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\’: +!]*([^<>\”\”])*$

17、郵政編碼:^[1-9]\d{5}$

18、中文:^[\u0391-\uFFE5]+$

19、電話號碼:^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{ 2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$

20、手機號碼:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$

21、雙字節字符(包括漢字在內):^\x00-\xff

22、匹配首尾空格:(^\s*)|(\s*$)(像vbscript那樣的trim函數)

23、匹配HTML標記:<(.*)>.*<\/\1>|<(.*) \/>

24、匹配空行:\n[\s| ]*\r

25、提取信息中的網絡鏈接:(h|H)(r|R)(e|E)(f|F) *= *(‘|”)?(\w|\\|\/|\. )+(‘|”| *|>)?

26、提取信息中的郵件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

27、提取信息中的圖片鏈接:(s|S)(r|R)(c|C) *= *(‘|”)?(\w|\\|\/|\.)+(‘| “| *|>)?

28、提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)

33、提取信息中的浮點數(即小數):(-?\d*)\.?\d+

34、提取信息中的任何數字:(-?\d*)(\.\d+)?

35、IP:(\d+)\.(\d+)\.(\d+)\.(\d+)

36、電話區號:/^0\d{2,3}$/

38、帳號(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

 

[Android] 讓你開發的Android程式也支援APP2SD

device1.png   

一個程式開發成這樣感覺起來也很偉大吧,所謂的APP2SD

一點都不難

這是 Android 2.2 的特色,只要在開發程式時給一個設定值

Android 2.2的系統會自動跳出這個視窗,詢問使用者是否將程式裝在記憶卡上

節省手機上有限的空間

至於如何做搬移,這就是Android系統自己會去調配的事情

它不會全部將程式裝在記憶卡上,而會搬移大部分的資料到記憶卡上

只會留下必要的程式在手機的儲存空間

也就是大家所謂的APP2SD

 

大部分的討論串大多是在如何強制讓系統直接搬移程式

在這裡教你如何在程式開發的角度上,把這項功能也考量進去

 

對於遊戲….等大容量的程式,Android官方是比較推薦上述類型的程式裝在記憶卡上

 


 

開發需求

只要一個最低需求

Android 2.2 (API Level:8)

做為最低開發的目標程式標準

(當然手機也要隨著配合啦….)

 

—————————————————————

AndroidManifest.xml 中,在<manifest> </manifest>的標籤上

加入一個android:installLocation的參數,本例為"auto"

如以下所示:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="com.J_Test.TestProject"

      android:versionCode="1"

      android:versionName="1.0"

      android:installLocation="auto">

    <uses-sdk android:minSdkVersion="8"
/>

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <activity android:name=".main"

                  android:label="@string/app_name">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

</manifest>

—————————————————————

關於installLocation

關鍵的參數android:installLocation

有三種參數能使用

internalOnly  就是只能限制於在主記憶體中運作

auto 就是自動判斷

preferExternal  是希望能裝在記憶卡中(例如:遊戲….)

不是所有程式都使用auto讓程式判斷就好

 

 

Android官方也提到

有些類型的程式不應該使用APP2SD的

因為把資料裝在記憶卡需考量到

記憶卡如果無緣無故被退出,程式很有可能會當掉(crash)

當然,沒有該有安裝程式的那張記憶卡,程式不會在Android系統中出現icon

 

 

 

 

Services  程式有寫到服務,需要在系統中常駐運行的

Alarm Services 有使用定時提醒的服務,記憶卡退出代表無法正常提醒使用者

Input Method Engines  你開發的程式是做為輸入法的程式

Live Wallpapers 你開發的程式是做為定時換桌布的類型的

Live Folders  放在Android桌面上的動態文件夾,記憶卡被卸載時,該資料夾會暫時消失

App Widgets   你開發的程式是有提供桌面的插件的

Account Managers   程式有使用到Account Manager這個class元件的

Sync Adapters  程式有使用到AbstractThreadedSyncAdapter這個class元件的

Device Administrators  程式有使用到DeviceAdminReceiver這個元件的,做為系統管理類型的

Broadcast Receivers listening for "boot completed"  你的程式會隨著系統開機而會自動執行的,系統剛開機時

 

 

在是否搬移頁面的提示框按下是,出現該程式的詳細資訊

device2.png

按下移至USB儲存裝置

device3.png

就把資料移到記憶卡裡了,就成功了

 device4.png

官方網站說明

http://developer.android.com/guide/topics/manifest/manifest-element.html#install
 http://developer.android.com/guide/appendix/install-location.html

參考資料

http://www.pin5i.com/showtopic-android-2.2-apk-installlocation.html

[Android] Desire HD adb.exe android 2.3.3 crash

注意:這只是網友的ㄧ個小更新,要尋求正統android.com官方的更新

如果官方的更新沒辦法解決問題才來看這裡

 

會出問題的

機種: HTC Desire HD

ROM: Android 2.3.3  (核心版本: 2.36.405.8 RADIO:12.54.60.25_26.09.04.11_M2)

就是使用機器達人出的特調GRI40-2的ROM

http://gfans.bryan.tw/2011/05/05/1894

 

Android SDK r11 (目前最新的)

在Windows 7 x64仍然會出現問題

在Windows XP x32似乎已解決問題,但還是偶爾不穩定

 

Android SDK r10 是確定不管是x32還是x64都有相同的問題

 

Version: Helios Service Release 2
Build id: 20110301-1815

Android Development Toolkit (ADT)
Version: 10.0.1.v201103111512-110841

Dalvik Debug Monitor Service (DDMS)
Version: 10.0.1.v201103111512-110841

Android Debug Bridge version 1.0.26

 

————————————————————–

後來更新到Android SDK r12仍然有這個問題

 

可能就要服用adb patch

 

http://android.googlecode.com/issues/attachment?aid=8293722374312378755&name=adb.exe&token=f780c80896314348c1a12f980f1aa9b0

 

 

 

(google了一下)

類似問題適用

http://forum.xda-developers.com/archive/index.php/t-938593.html
http://stackoverflow.com/questions/5455553/adb-crashing-in-eclipse
http://stackoverflow.com/questions/4573019/adb-crashes-when-device-attached-with-eclipse
http://stackoverflow.com/questions/4573019/adb-crashes-when-device-attached-with-eclipse

 

參考網址

http://code.google.com/p/android/issues/detail?id=12141

[Android] debug不用線,用ADB連接3G/wifi手機

介紹一個很酷的功能無意間看到的

常用Eclipse的人都知道

不管是來開發程式的,還是知名部落客拿來截圖免root權限的

都會用到DDMS

 

通常要用連接USB傳輸線連接到實體手機

等待DDMS跳出你的手機之後才做下一步動作 (開發程式,截圖…等等)

 

這裡教你debug不用線,用3G或wifi直接無線Deploy程式

直接線上出Log

真的還蠻酷的

 

條件

曾經連接過USB做過設定的手機

 

設定方法

1.  先確定手機有電,3G或Wifi的網路有開

2.  用 USB 傳輸線接上你的手機

3.  找到Android SDK的路徑 platform-tools/ 資料夾路徑

(每個人裝位置因作業系統或個人喜好的都不太一樣)

以SDK r11為例,用32位元的Windows用exe版的安裝預設在

C:\Program Files\Android\android-sdk\platform-tools

 

4.  按Win key + R,在執行的視窗中打入 cmd

打入指令 (綠色的為指令,黑色的部分為說明)

C:\

cd C:\Program Files\Android\android-sdk\platform-tools

意思是切換資料夾到剛剛找的路徑

adb tcpip 5555 

意思是用tcpip連線,連接埠號5555做Debug伺服器

 

5.  然後就可以脫離USB連線了

在同一個地方再打入像是

adb connect 192.168.1.3:5555 

中間換成你手機的IP位址

意思是讓電腦使用網路連線到你的手機

 

6.  這時候你就可以用無線做操作了

你可以打 adb logcat 

就會動態傳輸手機的Log到畫面上 (按Ctrl+C結束)

 

打入adb devices,就會列出這個特別的裝置

List of devices attached
192.168.1.3:5555     device

就不會是類似

List of devices attached
SH11KRX10258    device

這樣

 

回到Eclipse上,DDMS已經出現這個特別的裝置了

————————————————————

還原回正常的USB傳輸線的模式,要打 adb usb

 

————————————————————

官方原文截錄

  1. 用 USB 傳輸線接上你的手機
  2. 到Android SDK的路徑 platform-tools/ 資料夾
  3. directory, enter adb tcpip 5555 at the command prompt.
  4. Enter adb connect <device-ip-address>:5555 You should now be connected to the Android-powered device and can issue the usual adb commands like adb logcat.
  5. To set your device to listen on USB, enter adb usb.

http://developer.android.com/guide/topics/usb/index.html

 

————————————————————

補充

Root手機的用戶有福了 🙂

可以不用像是上面這麼複雜喔

Google Market裡面有提供

類似這種Wifi ADB的這種軟體唷

只是需要Root………不知道這是啥的就跳過這段吧

 

adbWireless (Widget version)

https://market.android.com/details?id=siir.es.adbWireless

WiFi ADB

https://market.android.com/details?id=com.ttxapps.wifiadb

 

其中我最喜歡這套

ADB over WIFI Widget
Mehdy Bohlool

https://market.android.com/details?id=bohlool.net.wifiadb

他安裝完沒有甚麼變化和圖示

 

要去桌面 menu >  小工具

然後找到ADB over WIFI Widget

就會有個圖示在你的桌面摟

 

 

電腦這端用上述的

adb connect 192.168.1.3

(192.168.1.3是那隻上面看到的IP)

就可以連上去成為一個裝置摟

 

不用的時候就按一下小綠人就又回復正常摟

 

 

這樣就可以遠端桌面,遠端debug摟

是不是粉方便呢?

 

 

 

 

 

Desire HD 進入安全模式

不知道有沒有人跟我一樣

不小心進入HTC製作的安全模式?

 

進入方法如下

手機重開機,手機震動後

會出現白色畫面中綠色HTC字樣的畫面

這時,等待其載入到出現

小標題quietly brilliant的字樣

的附近

長按音量下鍵 (可以多按幾次,每次都長按即可)

如果成功進入的話,手機會震動一下

而且左下角會寫著安全模式

 

官方寫法是這樣

在安全模式中,所有協力廠商的應用程式都無法執行,所以您可以成功地啟動手機,以解除安裝最近安裝的應用程式,或可能導致手機無法正確啟動的應用程式。

我的解釋是,自行安裝的程式 (所有不是燒在Rom裡的程式),都無法執行

 

離開安全模式,只要重開機即可

[教學] Windows 7 (x64) IME輸入法整合器的手寫版

2011-05-04 07 11 33.png

這篇只有在64位元Windows 7Vista才會有這個問題,32位元的是正常的

(以下有部份畫面是用英文版Win 7示範,但筆者很確定繁體中文的Win 7是可以使用的)


大家如果用過Office 2007 系列的產品

不難知道微軟的新注音輸入法有一個手寫辨識的功能

當你找不到字音要怎麼打的時候,使用滑鼠寫字讓系統去辨識

 

在這

工具選項 > 輸入法整合器

2011-05-04 07 10 25.png

就會看到這個問題畫面

2011-05-04 07 11 33.png

如果你是像筆者一樣是64位元Windows 7的話,就會發現

咦?手寫介面怎麼不見了?

 


 

問題的修正方法

 

按Win key + R,就會有傳統的執行畫面

打入cmd

2011-05-04 07 19 48.png

 

複製以下指令

%systemroot%system32regsvr32.exe "%systemroot%System32IMEIMETC10appletsIMTCCAC.dll"
%systemroot%SysWOW64regsvr32.exe "%systemroot%SysWOW64IMEIMETC10appletsIMTCCAC.dll"

 

這裡是要重新註冊IMTCCAC.dll,因為IMTCCAC.dll有分64位元和32位元

所以要依序在system32和SysWOW64的地方做重新註冊DLL

 

輸入完畢的畫面會像這樣,會依序跳出二個註冊成功的對話框

2011-05-04 07 21 20.png

另外也要用登錄檔修正

 

COPY下列文字將它存成ChtImePad64.reg

(可能要先開啟副檔名才能修改副檔名)


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOTCLSID{C0AA878E-97A5-44df-B7EF-2E732F7B2FEC}]
@="TC IME7 Handwriting Applet"

[HKEY_CLASSES_ROOTCLSID{C0AA878E-97A5-44df-B7EF-2E732F7B2FEC}Implemented Categories]

[HKEY_CLASSES_ROOTCLSID{C0AA878E-97A5-44df-B7EF-2E732F7B2FEC}Implemented Categories{E081E1D6-2389-43CB-B66F-609F823D9F9C}]

[HKEY_CLASSES_ROOTCLSID{C0AA878E-97A5-44df-B7EF-2E732F7B2FEC}InprocServer32]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,
  00,5c,00,53,00,59,00,53,00,54,00,45,00,4d,00,33,00,32,00,5c,00,49,00,4d,00,
  45,00,5c,00,69,00,6d,00,65,00,74,00,63,00,31,00,30,00,5c,00,61,00,70,00,70,
  00,6c,00,65,00,74,00,73,00,5c,00,69,00,6d,00,74,00,63,00,63,00,61,00,63,00,
  2e,00,64,00,6c,00,6c,00,00,00
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOTCLSID{C0AA878E-97A5-44df-B7EF-2E732F7B2FEC}ProgID]
@="IMEPad.HWR.TCIME7"

[HKEY_CLASSES_ROOTCLSID{C0AA878E-97A5-44df-B7EF-2E732F7B2FEC}VersionIndependentProgID]
@="IMEPad.HWR.TCIME"


然後執行剛剛存的ChtImePad64.reg

2011-05-04 07 25 07.png

需要Administrator的權限才能夠繼續

如果UAC提示關掉的話就會像我這樣,按Yes繼續

2011-05-04 07 26 08.png

修改登錄成功

2011-05-04 07 26 58.png  

 

 

然後再回到輸入法整合器做修正

按下那整合器的小圖示 > 輸入法選項 > 設定

 

2011-05-04 07 13 46.png

然後你會看到手寫識別其實是有載入的

我們將它移除,按下關閉之後,

2011-05-04 07 14 52.png

然後再重新新增回去,重新載入

2011-05-04 07 15 31.png

這時你的輸入法整合器就會多出一個小圖示

2011-05-04 07 16 17.png

 

 

然後…..

 

 

就可以像32位元一樣,正常的使用手寫識別的功能了

2011-05-04 07 16 26.png

 

 

參考資料

http://www.hkepc.com/forum/viewthread.php?tid=1368387

http://www.hkepc.com/forum/viewthread.php?tid=1320778

http://www.youtube.com/watch?v=lyVBPjiCB4M

http://www.facebook.com/note.php?note_id=337682464204

[Fedora12-14] 設定遠端桌面連線 (rdp)

大家都有用過WIndows的遠端桌面連線吧

其名稱叫做Remote Desktop Protocol (RDP)

是一個網路協定,微軟WinXP之後的都有他的Client可以說是非常方便

而Linux呢?沒有原生的RDP的Server

但有VNC,而且有個xrdp的軟體能夠『透過rdp協定』來連線vnc

設定上有一點點小複雜,不過應該還好

————————————————–

安裝vnc server

我之前也有寫過VNC的架設,大家可以參考一下

http://j796160836.pixnet.net/blog/post/20787531

這裡的設定跟之前寫的差不多,避免變成二篇文章後

大家設定不起來,還是簡單節錄一下

 

這裡我們用的是tightvnc server

直接下yum指令安裝

[root@localhost ~]# yum install vnc-server -y

 

安裝完畢後就可啟動服務

[root@localhost ~]# /etc/init.d/vncserver start

然後開一個user來做VNC連線登入的帳號,本例是vncDesktop

(也可以跟本機帳號一樣,如果是這樣就省略開帳號的動作)

[root@localhost ~]# useradd vncDesktop

設定密碼

[root@localhost ~]# passwd vncDesktop

如果是root登入,需要切換到該使用者,來設定vnc使用的密碼

[root@localhost ~]# su vncDesktop

設定vnc使用的密碼(這裡的密碼到時候就會是遠端桌面使用的密碼)

[vncDesktop@localhost ~]# vncpasswd

再切換回root

[vncDesktop@localhost ~]# su –

 

這裡需要設定哪個使用者需啟用vnc服務

[root@localhost ~]# vi /etc/sysconfig/vncservers

解除註解並修改

VNCSERVERS=”2:vncDesktop
VNCSERVERARGS[2]=”-geometry 800×600 -nolisten tcp -localhost”

 

 

2冒號  不可省略,指的是Terminal的號碼
VNCSERVERARGS註解要拿掉

 

 

然後重啟vnc服務,套用新設定

[root@localhost ~]# /etc/init.d/vncserver restart

這時候,如果沒有提示錯誤的話

應該會跑vnc在5902的port

這個port防火牆可以不開,也不需要開,因為我們要用xrdp去連vnc

 

————————————————–

 

安裝xrdp

 

這裡還是要再三描述觀念

xrdp是基於vnc服務的服務,所以vnc的架設和設定不能省略

架設方法在上文

 

xrdp安裝一樣直接下yum指令安裝

[root@localhost ~]# yum install xrdp -y

 

安裝完畢後就可啟動服務

[root@localhost ~]# /etc/init.d/xrdp start

 

防火牆對應做修改,打開3389的port

[root@localhost ~]# vi /etc/sysconfig/iptables

加一行文字,打開3389的port

-A INPUT -m state –state NEW -m tcp -p tcp –dport 3389  -j ACCEPT

 

然後記得重啟防火牆,讓他套用新設定

[root@localhost ~]# /etc/init.d/iptables restart

 

 

————————————————–

我們需要修改startwm.sh修改啟動X Window的的順序

因為Fedora來說預設只有裝gnome

所以我們需要把它改到優先(橘色為修改)

[root@localhost ~]# vi /etc/xrdp/startwm.sh

#!/bin/sh -l

# change the order in line below to run to run whatever window manager you
# want, default to kde

SESSIONS=”gnome-session startkde startxfce4 xterm”

# change PATH to be what your environment needs usually what is in
# /etc/environment
#PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games”
#export PATH=$PATH

# for PATH and LANG from /etc/environment
# pam will auto process the environment file if /etc/pam.d/xrdp-sesman
# includes
# auth       required     pam_env.so readenv=1
#. /etc/environment
#export PATH=$PATH
#export LANG=$LANG

# for bash profile
#. ~/.bash_profile
#. /etc/profile

for WindowManager in $SESSIONS
do
  which $WindowManager
  if test $? -eq 0
  then
    echo “Starting $WindowManager”
    $WindowManager
    exit 0
  fi
done

exit 1

————————————————–

接下來,在實際測試的時候會出現一個很奇怪的現象

就是xrdp之後,滑鼠正常,但鍵盤就是無法使用

無法打入帳號密碼

後來發現是因為是鍵盤配置檔出問題

因為

在繁體中文的環境下,xrdp會抓不到對應的鍵盤配置檔

 

所以我們必須修正這個問題

以我的為例,xrdp的設定檔有這些

[root@localhost ~]# ls /etc/xrdp/

km-0004.ini  km-0409.ini  km-0419.ini  sesman.ini   xrdp.sh      
km-0404.ini  km-040c.ini  km-041d.ini  startwm.sh   
km-0407.ini  km-0410.ini  rsakeys.ini  xrdp.ini     

請注意這些km-xxxx.ini這些就是鍵盤配置檔

km-0409.ini 這個是英文的鍵盤配置

以下列出一些常看到的語系代碼,如果沒有的話請到以下網址去參考

http://xrdp.sourceforge.net/documents/keymap/rfc1766.html

 

“0004”=”zh;Chinese”
“0404”=”zh-tw;Chinese (Taiwan)”
“0804”=”zh-cn;Chinese (China)”
“0C04″=”zh-hk;Chinese (Hong Kong SAR)”
“1004”=”zh-sg;Chinese (Singapore)”

“0409”=”en-us;English (United States)”
“0809”=”en-gb;English (United Kingdom)”
“0C09″=”en-au;English (Australia)”
“1009”=”en-ca;English (Canada)”
“1409”=”en-nz;English (New Zealand)”
“1809”=”en-ie;English (Ireland)”
“1C09″=”en-za;English (South Africa)”
“2009”=”en-jm;English (Jamaica)”
“2809”=”en-bz;English (Belize)”
“2C09″=”en-tt;English (Trinidad)”

 

以繁體中文0404為例,因為我們的鍵盤配置跟英文一樣

所以只要打上這個指令就行了

[root@localhost ~]# cp /etc/xrdp/km-0409.ini /etc/xrdp/km-0004.ini

[root@localhost ~]# cp /etc/xrdp/km-0409.ini /etc/xrdp/km-0404.ini

其他鍵盤方面沒講到的地方都在這:

http://xrdp.sourceforge.net/documents/keymap/newkeymap.html

 

————————————————–

最後,測試成功後,就可以將它設定為開機自動啟動

[root@localhost ~]# chkconfig xrdp on

[root@localhost ~]# chkconfig vncserver on

————————————————–

參考資料

http://hpclab.cs.pu.edu.tw/wiki/index.php/Xrdp#.E9.8D.B5.E7.9B.A4.E9.8C.AF.E4.BA.82

http://chip.twbbs.org/2009/06/xrdpubuntu-904.html

[Android] 使用HTTP的POST方式和網頁表單溝通

 

2011-04-21 02 04 20.png  


2012.08.13版主回覆:

底下好多留言都詢問,奇怪?怎麼模擬器上都出現文字
然後網頁上沒出現?

不要再相信沒有事實根據的說法了 (大誤
不要再說沒有小弟不才,沒有爬文 

請移步至新版:

http://j796160836.pixnet.net/blog/post/30577968

個人還是建議從本篇看起,概念比較清楚


 

 最近常常被問到這些問題

Android要怎麼接MySQL資料庫呀? MySQL在網路上

Android怎麼接上雲端的資料庫?

Android怎麼傳送表單內容?

 

這些答案都在這裡

網路上的資料庫,不太容易,也不建議直接與資料庫做溝通

因為涉及到資訊安全的東西

 

 

可以用網頁來做中間的介面,讓二者產生關聯

做類似WebServices的東西
(雖然不是真正的WebServices,但其角色是類似的)

 


伺服器端

你可以簡單寫個印字串的程式,如果收到POST的封包

就印出其內容

如果是PHP可能這樣寫

<?php

        //宣告utf-8的編碼

        header("Content-Type:text/html; charset=utf-8");

        $data=$_POST[‘data’];

        echo "data=".$data;

?>

把寫好程式,取名httpPostTest.php

把他擺到htdoc底下 (windows)

或是/var/www/ (ubuntu)

或是/var/www/html (Fedora, Cent OS)

用ASP可能這樣寫

<%@ LANGUAGE=VBScript CodePage=950%>
<%
data=request("data")
response.write "data="&data
%>

不管如何,請照你的伺服器語言撰寫

 


Android手機端

 

可以用範例程式碼來解決問題

這些範例仿間找的到

因為過於複雜,所以我又重新整理了其範例給大家看

 

關鍵程式碼不到5行,但重點是在於你對Android的UI介面認識與否

和動態網頁的語言的熟練度

 

 


照慣例,文字要放在string.xml裡

/res/values/string.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="app_name">httpPostTest</string>

    <string name="help_txt">請輸入文字以便使用POST傳送:</string>

    <string name="txt_message_hint">請輸入文字</string>

    <string name="send">送出</string>

</resources>


看一下Layout檔

/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/help_txt"

    />

    <EditText

    android:id="@+id/txt_message"

    android:hint="@string/txt_message_hint"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

   />

   <Button

   android:id="@+id/send_btn"

   android:text="@string/send"

   android:layout_width="fill_parent"

   android:layout_height="wrap_content"

   />

</LinearLayout>

 

這裡沒甚麼特別,就是一個EditText來讓使用者能打入資料

然候一個按鈕讓系統傳送封包到寫死的網址路徑

 


程式碼要上了

main.java

 

package com.J_Test.httpPostTest;

 

/*

 * ====httpPostTest範例====

 * 1. 請先確認Apache有沒有正確執行

 * 2. 放入以下PHP代碼到htdoc資料夾中(或是/var/www/)等路徑

 *

 

 <?php

 //宣告utf-8的編碼

 header("Content-Type:text/html; charset=utf-8");

 $data=$_POST[‘data’];

 echo "data=".$data;

 ?>

 

 *

 * 3. 修改uriAPIIP和檔案名稱為正確 (請用電腦對外之IP)

 * (不可用127.0.0.1因為Android手機上也有本機位址)

 *

 */

 

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

 

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.protocol.HTTP;

import org.apache.http.util.EntityUtils;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

 

publicclass main extends Activity implements OnClickListener

{

    private EditText txtMessage;

    private Button sendBtn;

    private String uriAPI = "http://192.168.1.3/httpPostTest.php";

 

    @Override

    publicvoid onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

 

        txtMessage = (EditText) findViewById(R.id.txt_message);

        sendBtn = (Button) findViewById(R.id.send_btn);

 

        if (sendBtn != null)

        {

            sendBtn.setOnClickListener(this);

        }


    }

 

    @Override

    publicvoid onClick(View v)

    {

        if (v == sendBtn)

        {

            String msg = null;

            if (txtMessage != null)

            {

                msg = txtMessage.getEditableText().toString();

                String result = sendPostDataToInternet(msg);

 

                // 印出網路回傳的文字

                if (result != null)

                    Toast.makeText(this, result, Toast.LENGTH_LONG).show();

            }

        }

    }

 

    private String sendPostDataToInternet(String strTxt)

    {

        / 建立HTTP Post連線 /

        HttpPost httpRequest = new HttpPost(uriAPI);

        /*

         * Post運作傳送變數必須用NameValuePair[]陣列儲存

         */

        List<NameValuePair> params = new ArrayList<NameValuePair>();

        params.add(new BasicNameValuePair("data", strTxt));

        try

        {

            / 發出HTTP request /

            httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

            / 取得HTTP response /

            HttpResponse httpResponse = new DefaultHttpClient()

                    .execute(httpRequest);

            / 若狀態碼為200 ok /

            if (httpResponse.getStatusLine().getStatusCode() == 200)

            {

                / 取出回應字串 /

                String strResult = EntityUtils.toString(httpResponse

                        .getEntity());

 

                // 回傳回應字串

                return strResult;

            }

 

        } catch (ClientProtocolException e)

        {

            Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_SHORT)

                    .show();

            e.printStackTrace();

        } catch (IOException e)

        {

            Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_SHORT)

                    .show();

            e.printStackTrace();

        } catch (Exception e)

        {

            Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_SHORT)

                    .show();

            e.printStackTrace();

        }

        returnnull;

    }

 

}

 

 


最後是AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="com.J_Test.httpPostTest"

      android:versionCode="1"

      android:versionName="1.0">

    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <activity android:name=".main"

                  android:label="@string/app_name">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

    <!– 這裡加入可以存取網路的權限 –>

    <uses-permission android:name="android.permission.INTERNET" />

</manifest>

 

這裡很重要也很容易疏忽

除了Activity要在這裡註冊外

能對外上網的權限也在這裡註冊

如果遇到

WARN/System.err(503): java.net.SocketException: Permission denied

就該發現權限少了這一項

<uses-permission android:name="android.permission.INTERNET" />

另一個權限也常用,但仿間書常常會遺漏

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

就是能夠存取手機記憶卡的權限

 

 


這樣有看懂嗎?

 

主要重點在這裡

  / 建立HTTP Post連線 /

  HttpPost httpRequest = new HttpPost(uriAPI);

這個HttpPost是主要的Class名,這裡要填入存取的網址

 

然後

 /*

  * Post運作傳送變數必須用NameValuePair[]陣列儲存

  */

  List<NameValuePair> params = new ArrayList<NameValuePair>();

  params.add(new BasicNameValuePair("data", strTxt));

 

使用系統指定的資料格式BasicNameValuePair

BasicNameValuePair在new的時候裡面為二個字串,一個是名稱,一個是值

這裡用"data"當名字,值就是剛剛讓使用者打的資料

 

  / 發出HTTP request /

  httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

的  HTTP.UTF_8 可以指定編碼格式,不過要跟伺服器端相同(照我範例走的話是不用動)



2011-04-21 02 18 45.png  

其實這個Android其實是跟以下網頁的功能是相同的

有些值你可以對照看看,相關對照的字詞都用顏色標明了

可以將它另存到httpPostTest.htm

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt;

<html xmlns="http://www.w3.org/1999/xhtml”&gt;

<head>
<meta http-equiv="Content-Language" content="zh-tw" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF_8" />
<title>httpPostTest</title>
<head></head>
<body>
請輸入文字以便使用POST傳送:<br />
<form method="POST" action="http://192.168.1.3/httpPostTest.php">
<input type="text" name="data" size="20" value="請輸入文字" /><br />
<input name="Submit1" type="submit" value="送出" /><br />
</form>
</body>
</html>

 


延伸

其實網頁大多喜歡把很多功能做在一個檔裡,就是用一個隱藏值來判斷現在進行到那個階段

本例用op當階段的旗標

 

PHP版:

請輸入文字以便使用POST傳送:<br />
<form method="POST" action="<?php echo $_SERVER[‘PHP_SELF’]; ?>">
<input type="text" name="data" size="20" value="請輸入文字" /><br />
<input type="hidden" name="op" value="showValue" />
<input name="Submit1" type="submit" value="送出" /><br />
</form>

 

ASP版:

 

請輸入文字以便使用POST傳送:<br />
<form method="POST" action="<%=Request.ServerVariables("PATH_INFO")%>">
<input type="text" name="data" size="20" value="請輸入文字" /><br />
<input type="hidden" name="op" value="showValue" />
<input name="Submit1" type="submit" value="送出" /><br />
</form>


2011-04-21 02 05 40.png

   2011-04-21 02 17 35.png  

 

2011-04-21 02 25 29.png  

 

不過還是再三的提醒

範例程式碼很簡陋,指是要讓大家看懂其中的語法

真正寫程式使用的時候

 

要記得在伺服器判斷輸入的型別

更不要直接讓表單直接下SQL指令

 

怕被資料隱碼攻擊(SQL Injection)

 

這是很危險低~~~~

 

 

參考資料
Google Android SDK開發範例大全 佘志龍等人著
悅知文化

[Android] 從新建專案看版面Layout設計

這部分給剛入門的Android新手看的,寫的不好請多包涵

 

一個Android手機程式中

一個畫面,包含可能程式化的內容,就可以稱為一個Activity

定義不重要,這只是我的解釋而已

至少一個Activity會抓一個Layout檔,來顯示版面

才能做之後的事情

 

———————————————————–

 

而Android的版面Layout基本上都是用XML做定義的

XML概念跟HTML有那麼一點點相似,但不太一樣

XML自訂性較高,但也較嚴謹,只要出錯整的檔都會讀不出來

基本上原則就是

  • Node要成雙成對,沒有結束符號要加上 / 符號
  • Root Node素只能有一個

這部分就不再贅述

 

 

這是剛新建專案的Layout

layout.xml,路徑在res/layout/main.xml

新開的檔會以建立的Activity做名稱,一個Activity可以有一個Layout檔,也可以用人家的(自己沒有)

<?xml version=“1.0” encoding=“utf-8”?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

    android:orientation=“vertical”

    android:layout_width=“fill_parent”

    android:layout_height=“fill_parent”

    >

<TextView 

    android:layout_width=“fill_parent”

    android:layout_height=“wrap_content”

    android:text=“@string/hello”

    />

</LinearLayout>

 

 

首先看看Layout檔

HelloWorld只會有二個控制項,也是首先會接觸到的

TextView 

手機螢幕部分只要眼睛看的見的幾乎都是控制項,叫做View

有以下屬性

    android:layout_width  為控制項的寬度

    android:layout_height  為控制項的高度

單位可以填dip,也是最常用的,就是單位螢幕點(相對長度),依解析度和螢幕尺寸不同而會有不同

也可以填像素px啦 (這樣會失去自動調整的能力,官方不建議)

也可以填以下屬性:

    “fill_parent”    代表填滿父控制項,在這裡通常是指撐滿螢幕(寬度或是高度)

  “wrap_content” 就是指依照你內容有多少就給你多少(寬度或是高度)

android:text  就是要顯示的文字拉

 

怎麼沒有看到  Hello World, main!   呢?

原來文字存到string.xml裡了

“@string/hello” 這樣就是在指,去string.xml找到名為hello的字串,當然也可以直接打上去拉,只是不建議這樣做,以後有關多國語言會提到

 

 

這裡是string.xml,路徑在res/value/string.xml

<?xml version=“1.0” encoding=“utf-8”?>

 

<resources> 

    <string name=“hello”>Hello World, main!</string>

    <string name=“app_name”>Hello World test</string>

</resources> 

 

之後會提到android:id的部分,這裡先不提

 

———————————————————–

再來講

LinearLayout 

這種Layout的家族統稱稱為ViewGroup

ViewGroup可以想成各種View的群組,有以下幾種

  • AbsoluteLayout
  • RelativeLayout
  • FrameLayout
  • LinearLayout

通常也最常用的就是LinearLayout,原因無他,只是方便好用

LinearLayout只會做一件事,指定一個方向(垂直或是水平)

然後不管控制項有多大,全部照樣往下(或往右)排排站

 

在這裡LinearLayout有以下屬性

xmlns:android=“http://schemas.android.com/apk/res/android”   這句話絕對不能省略,放在最外層的那控制項即可

依據XML的特性,要去指定一些標籤的定義,就像法條才會有憑有據

android:orientation=“vertical”   就是排列方向為垂直(由上而下)

android:orientation=“horizontal”   就是排列方向為水平(由左而右)

 

———————————————————–

講一下

RelativeLayout 

好了

在Layout檔看起來如下:

 

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android” 

    android:layout_width=“fill_parent”

    android:layout_height=“fill_parent”

    >

 

</RelativeLayout>

看起來跟LinearLayout沒啥不同

但多的特性就多了

首先,他沒有android:orientation可以用,因為他是用控制項的相對位置去編排的

如果控制項沒有設定那些多出來的參數,很有可能會發生二控制項重疊

裡面的控制項屬性會多出二種類型的屬性

  • 邊框位置
  • 跟另一個控制項的相對位置

屬性有以下:

 

android:layout_alignLeft 

android:layout_toRightOf 

android:layout_below 

android:layout_above 

android:layout_alignParentLeft 

android:layout_alignParentTop 

android:layout_alignParentRight 

android:layout_alignParentBottom 

android:layout_centerInParent 

 

 

邊框位置

先有一個控制項位置做絕對位置,才能做相對位置的判定嘛

以word的文字編排方式可以很直覺的理解

android:layout_alignParentLeft  靠左對齊,(吸附邊框左邊)

 

android:layout_alignParentTop   靠上對齊,(吸附邊框上方)

android:layout_alignParentRight   靠右對齊,(吸附邊框右邊)

android:layout_alignParentBottom   靠下對齊,(吸附邊框下方)

android:layout_centerInParent    置中,(計算放在正中間)

這類型就是以RelativeLayout的邊框做位置,做對齊

 

而另一種就是以別人的控制項位置做為自己的控制項位置

 

android:layout_toLeftOf       這在(等下要寫的控制項的名)的左邊

android:layout_toRightOf        這在(等下要寫的控制項的名)的右邊

android:layout_below        這在(等下要寫的控制項名)的下面

android:layout_above       這在(等下要寫的控制項名)的上面

 

這個等下要寫控制項的名稱,很重要

控制項的順序也很重要

基本上,這個名子一定要再你的Layout上有提及

還有這個控制項名稱要在XML敘述上比現在這個控制項還要早出現

XML的Layout檔上基本上可以先寫靠左或靠右對齊的控制項敘述

才寫這種相對敘述

 

控制項在XML裡寫的順序很重要

—————————————————–

 

 

補充:FrameLayout 

 

FrameLayout可以想成是RelativeLayout的功能閹割版

 

RelativeLayout的部份

 

1. 能對齊View的框邊

例如:

android:layout_alignParentLeft  靠左對齊,(吸附邊框左邊)

或是

2. 設定二格View之間的排列關係

例如:

android:layout_toLeftOf       這在(等下要寫的控制項的名)的左邊

上面都提過了

 

 

FrameLayout只剩下

 

對齊View的框邊的功能

android:layout_gravity  來指定

如果在其中的View有二個設定成一樣的話呢

就會「依序」重疊上去

 

注意一點,只有RelativeLayoutFrameLayout 

才會發生控制項有重疊的現象

如果版面看似調不出來,可以檢查一下是否為二個控制項重疊

或是版面出界了

 

版面出界的狀況在初期很容易發生

 

像是LinearLayout 裡面有二個控制項

第一個控制項是  android:layout_width=“fill_parent”    android:layout_height=“fill_parent”

填滿全螢幕

第二個  android:layout_width=wrap_content    android:layout_height=wrap_content

這樣第二個一定出界的

 

設定上要小心

 

—————————————————–

所有的View和ViewGroup都可能需要android:id這東西

他會在Compile專案時會產生一個R檔,就是gen/你的package名稱/R.java

這個R檔會包含你的所有Layout上的所有id和string.xml上的名稱….等等內容,沒事別去動他

寫法如下

    android:id=“@+id/tv01”

這裡的@就是叫程式去R檔裡面找到代稱叫做tv01的id名稱

這裡的+號不能省略,代表的是我需要在R檔裡新增一個id名稱叫做

這個所有的Layout檔都適用,不同Layout裡的控制項id最好是要不一樣

在一個Layout檔中,控制項的id一定要不同

 

到時候程式可以用findViewById去依照這個id抓取其控制項

 

—————————————————–

底下寫一個LinearLayout的範例,改用RelativeLayout會怎麼寫

 

現在用LinearLayout來撰寫Layout

 

<?xml version=“1.0” encoding=“utf-8”?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

    android:orientation=“vertical”

    android:layout_width=“fill_parent”

    android:layout_height=“fill_parent”

    >

<TextView 

    android:id=“@+id/tv01”

    android:layout_width=“wrap_content”

    android:layout_height=“wrap_content”

    android:text=“Text01”

    />

    <TextView 

    android:id=“@+id/tv02” 

    android:layout_width=“wrap_content”

    android:layout_height=“wrap_content”

    android:text=“Text02”

    />

    <TextView 

    android:id=“@+id/tv03”

    android:layout_width=“wrap_content”

    android:layout_height=“wrap_content”

    android:text=“Text03”

    />

    <TextView 

    android:id=“@+id/tv04”

    android:layout_width=“wrap_content”

    android:layout_height=“wrap_content”

    android:text=“Text04”

    />

    <TextView 

    android:id=“@+id/tv05”

    android:layout_width=“wrap_content”

    android:layout_height=“wrap_content”

    android:text=“Text05”

    />

</LinearLayout>

 

 

—————————————————–

改用RelativeLayout會變成

 

 

<?xml version=“1.0” encoding=“utf-8”?>

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

    android:layout_width=“fill_parent”

    android:layout_height=“fill_parent”

    >

<TextView 

    android:id=“@+id/tv01”

    android:layout_alignParentTop=“true”

    android:layout_alignParentLeft=“true”

    android:layout_width=“wrap_content”

    android:layout_height=“wrap_content”

    android:text=“Text01”

    />

    <TextView 

    android:id=“@+id/tv02” 

    android:layout_below=“@id/tv01”

    android:layout_width=“wrap_content”

    android:layout_height=“wrap_content”

    android:text=“Text02”

    />

    <TextView 

    android:id=“@+id/tv03”

    android:layout_below=“@id/tv02”

    android:layout_width=“wrap_content”

    android:layout_height=“wrap_content”

    android:text=“Text03”

    />

    <TextView 

    android:id=“@+id/tv04”

    android:layout_below=“@id/tv03”

    android:layout_width=“wrap_content”

    android:layout_height=“wrap_content”

    android:text=“Text04”

    />

    <TextView 

    android:id=“@+id/tv05”

    android:layout_below=“@id/tv04”

    android:layout_width=“wrap_content”

    android:layout_height=“wrap_content”

    android:text=“Text05”

    />

</RelativeLayout>

 

 

 

 

android:orientation=“vertical”