highlight.js

星期二, 9月 25, 2012

Eclipse 中文化後變回英文介面

大部分的人都知道可以到 Eclipse 的 Babel 專案頁面中下載中文化的語言包, 讓 Eclipse 變成中文介面。不過 Eclipse 預設會根據作業系統目前的語系設定, 使用對應的語言包。也就是說, 一旦你安裝了繁體中文的語言包, 那麼預設就是中文的介面, 而這在 Eclipse 中並設定畫面可以更改。

如果想將 Eclipse 改回英文介面, 網路上大部分人的作法都是建議在執行 Eclipse 時, 加上參數指定語系為英文, 例如:
eclipse.exe -vmargs   -Duser.language=en” 
為了方便起見, 你可以建立不同的捷徑, 在不同語系之間轉換。不過實際上會想換回英文, 大概也都不需要在不同語系間切換了, 這時可以把上述的參數加到在 Eclipse 資料夾下的 eclipse.ini 檔案中, 例如:
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar

...............................
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Dhelp.lucene.tokenizer=standard
-Xms40m
-Xmx384m
-Duser.language=en”
這樣執行 eclipse 時就會強制改用英文語系了。

星期六, 9月 22, 2012

錯誤訊息:Missing styles. Is the correct theme chosen for this layout?

Android 開發採用 Eclipse 作為整合開發環境, 不過這 Eclipse 真的是有許多狀況, 今天同事給我一個很簡單的專案檔案, 說怎麼跑都會出錯, 程式當掉。我看了之後, 雖然發現了程式撰寫上的問題, 但還看到一個怪怪的畫面, 我打開 layout 檔案後看到的是這樣:


首先注意到的是怎麼不管是 TextView 或是 Button 的樣子都很怪, 有些字還疊在一起。然後看到下方顯示了 "Missing styles. Is the correct theme chosen for this layout?" 的錯誤訊息, 但明明使用的就是建立專案後預設的 AppTheme 啊?檢查了 styles.xml、AndroidManifest.xml 的內容, 都沒有改過, AppTheme 的定義都沒有錯誤。如果從上方選取 theme 的功能表拉下來看, 會發現原來根本就誤以為專案中沒有定義 AppTheme 這個主題:


顯然一定是資源的相關資料亂掉了, 只好死馬當活馬醫, 先隨便換個現在系統認得的主題:


果然改個主題之後, 畫面看起來就正常多了:


但是下方還有個錯誤訊息, 這次變成找不到 @string/app_name 這個字串資源了, 所以畫面的標題無法顯示 App 的名稱。明明剛剛都沒問題, 也沒去動過 strings.xml 檔, 根據經驗, 當 Eclipse 頭腦不清時, 最有用的作法就是重新啟動 Eclipse, 重新啟動之後果然一切正常, 而且也認得專案中有定義 AppTheme 主題, 就算再選回 AppTheme 也沒有問題:


之後專案就完全正常了, 接著將之前提到有問題的程式碼改正後, 執行起來也都正確無誤。Eclipse, 我真是被你打敗了! (可以來個 Visual Studio for Android 嗎?)

Android Virtual Device 模擬器的儲存位置

我自己的習慣都是把資料單獨儲存在一個分割區中, 與作業系統分開, 不過因為 Windows 預設的使用者資料夾就是在 C, 所以在建立 Android 模擬器時, 預設也都會儲存到 C 下, 經過 Google 一下, 只要設定一個環境變數 ANDROID_SDK_HOME, 指定希望儲存的目的資料夾, 就可以讓 Android Virtual Device Manager 把新建立的模擬器儲存到指定位置了。


這同時也可以解決當使用者名稱有中文時, 無法從包含名稱有中文的資料夾啟動模擬器的問題。

讓 jQuery Mobile 頁面上的固定式頁首與頁尾工具列不會因碰觸畫面而隱藏

有朋友今天傳了一個 jQuery Mobile 的頁面給我, 程式如下:
<!DOCTYPE html> 
<html>
<head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, minimum-scale=1, maximum-scale=1"> 
 <title>jQuery Mobile Demo</title> 
 <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.1/jquery.mobile-1.1.1.min.css" />
 <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
 <script type="text/javascript">
 $(document).bind("mobileinit", function(){
  $("[data-role=header],[data-role=footer]").fixedtoolbar({ tapToggle:false });
 });
 </script>
 <script src="http://code.jquery.com/mobile/1.1.1/jquery.mobile-1.1.1.min.js"></script>
</head> 

<body> 
<div data-role="page">
 <div data-role="header" data-position="fixed" data-fullscreen="true">
  <h1>全螢幕標頭</h1>
 </div>
 <div data-role="content">
  <img src="mycat.jpg" /> 
 </div>
</div>
</body>
</html>
這個程式是希望能在初始化的階段透過第 11 行的程式設定固定在頁首與頁尾的工具列不會因為使用者碰觸畫面而自動隱藏或重現, 不過實際執行之後, 發現設定失效, 工具列還是會以預設的方式自動隱藏或重現。經過查詢 jQuery Mobile 文件以及 Google 爬文後, 發現 mobileinit 事件發生時, 其實後續的 HTML 內容並未載入, 因此事件處理方法中的 $("[data-role=header],[data-role=footer]") 根本就抓不到元素, 自然無法讓期望的設定生效。為了解決這個問題, 只要改成處理 pageinit 事件, 也就是在後續的 HTML 內容生成後再進行設定, 就可以正確執行了。修改的程式如下:
$(document).bind("pageinit", function(){
 $("[data-role=header],[data-role=footer]").fixedtoolbar({ tapToggle:false });
});
你也可以在事件處理的程式中多加上一行 alert() 呼叫, 就可以觀察實際抓取到的元素內容了:
$(document).bind("pageinit", function(){
 $("[data-role=header],[data-role=footer]").fixedtoolbar({ tapToggle:false });
 alert($("[data-role=header],[data-role=footer]").text());
});

星期四, 9月 20, 2012

免費雙窗格檔案總管軟體的測試

之前因為一直會出現『Windows 檔案總管 已經停止運作』的錯誤, 很是困擾, 所以嘗試改用一些替代品, 而我習慣會開多個檔案總管, 所以找來試用的就是類似 Total Commander 這樣可以有兩個窗格並列的軟體來試用, 先把這幾天試用過的軟體缺點寫下來, 以後就不用再重試了:
  • Multi Commander: 使用起來還不錯, 可是我在複製資料夾或是從 7Zip 拖拉資料夾到某一個窗格中的資料夾時, 會有複製不完全的狀況, 不知道是什麼原因, 可是這狀況很恐怖, 萬一我誤以為資料都已複製完成, 把來源資料刪除, 那就慘了!
  • Free Commander:這軟體小巧輕盈, 但是在複製檔案等長時間動作時, 就會整個 hang 住, 無法進行其他操作, 這可是大問題, 所以也放棄了。
  • FreeCommander XE:這是 Free Commander 的下一版, 不過目前還處在 Beta 階段, 但試用過後真的很不賴, 像是前面提過複製檔案等動作時, 已經不會 block 住 UI, 並且這個版本除了雙面板以外, 每一個面板都有活頁功能, 所以可以再單一面板配置多頁, 每一頁顯示不同的資料夾, 非常方便, 現在正列為日常使用工具長期測試中。
其實這類軟體還有很多, 有時間會再測試。


星期六, 9月 15, 2012

Ubuntu 奇怪的『不使用密碼登入』

今天手賤, 看到使用者帳號的設定中在密碼的地方有『不使用密碼登入』的選項:

我一向不喜歡一直打密碼, 想說這樣設定之後應該很方便, 沒想到設定後雖然登入確實不用密碼, 但所有需要權限認證的地方 (當然包含 su 指令) 卻都無法認證了, 不打密碼也不行、打了原本的密碼還是不行, 可是如果切到 Console 登入, 卻又一切正常。最後還是依靠 Google 大神搜尋, 解法就是開個終端機, 用 passwd 指令更改密碼就可以了。所以最後我還是用 passwd 設成的密碼, 一切就正常, 而使用者帳號設定的地方就又變回需要密碼才能登入。

星期六, 9月 08, 2012

Android 的 process、activity、task 與 back 鈕的關係

在 Android 系統中, 一個 App 主要是以畫面為單位來切分程式單元, 每個程式單元就稱為一個「活動 (Activity)」, 負責處理單一畫面的工作, 包含畫面本身的構成、顯示以及該畫面與使用者的互動。以 Gmail 內建 App 為例, 就具有信件清單、信件內容、編寫新郵件等不同的畫面, 每一個畫面就由一個活動來處理。活動一開始的工作, 就是將畫面顯示出來, 例如 Gmail 的信件清單畫面, 就要擺個能夠切換不同標籤信件的按鈕, 並且放置一個列表元件顯示信件清單。畫面顯示出來之後, 活動也必須負責像是使用者按了清單中的某一封信件時要跳轉到信件內容畫面的動作。在同一個 App 的所有活動之中, 必須指定其中一個為「主活動 (main activity)」, 也就是 App 一開始時要最先執行的活動。

由上可知, 當我們使用 Android 系統時, 畫面的跳轉實際上就是從一個活動跳到另一個活動, 系統會幫我們把活動跳轉的過程記錄下來, 當我們按了 Back 按鈕時, 系統就會依照跳轉的歷程, 結束目前的活動, 返回到前一個活動。舉例來說, 如果你在 Gmail 的信件清單中按了某一封信件, 這時處理信件清單畫面的活動就會跳轉到顯示信件內容的活動, 由該活動將信件內容顯示出來, 此時如果按了 Back 鈕, 就會結束顯示信件內容的活動, 回到前一個活動, 也就是顯示信件清單的活動。活動跳轉的歷程是紀錄在一個堆疊中, 稱為「返回堆疊 (back stack)」, 而返回堆疊裡的這一串活動, 就統稱為是一個「任務 (task)」, 任務中第一個推入到返回堆疊中的活動稱為「根活動 (root activity)」。

一個任務是由使用者在 Home 畫面或是應用程式列表中點選了某個 App 的圖示開始, 假設此 App 名稱為 A1, 此時 A1 的主活動就會推入返回堆疊中成為根活動, 隨著使用者的操作切換畫面, 並將對應的活動堆入返回堆疊。如果使用者按了 Back 鈕回到根活動, 並再次按下 Back 鈕從根活動回到 Home 畫面, 那麼整個任務就結束了。如果在任務尚未結束的情況下, 使用者按了 Home 鈕回到 Home 畫面, 並點選執行了另外一個 App, 假設名稱為 A2, 此時系統就會建立一個新的任務, 配置一個新的返回堆疊, 並以 A2 的主活動為根活動。這個時候, 系統中同時存在兩個任務, 如果長按 Home 鈕, 就可以在兩個任務之間切換。

要特別注意的是長按 Home 鈕時會看到的 App 圖示是以任務為單位, 而不是以活動為單位。舉例來說, 如果你執行了瀏覽器, 接著在瀏覽器的網頁瀏覽畫面中使用分享的功能進入 Gmail 編寫新郵件的畫面, 此時的任務是由瀏覽器開始, 因此若是長按 Home 鈕, 只會看到瀏覽器的圖示, 而不會看到 Gmail 的圖示。另外, 如果已經有以某個 App 開始的任務在執行, 那麼在 Home 畫面點選該 App 圖示時會直接切換到該任務, 而不會建立新的任務。


在 Android 系統中, 編譯好的 App 經過安裝後就存在檔案系統中, 當使用者點觸某個 App 的圖示執行時, 系統就會將 App 相關的程式碼載入到記憶體中執行, 在系統中執行的 App 就稱為是「行程 (Process)」, 系統會紀錄相關的資訊。當行程執行, 完成初始動作後, 就會執行主活動, 開始與使用者互動。


星期三, 9月 05, 2012

PhoneGap 問題又一樁:index.html 檔載入太慢

今天同事在測試 PhoneGap 做出來的 Android App 時, 又遇到了一個靈異現象, 他使用 Samsung SIII 測試可以正常執行的 App, 到了我的 LG P970 上一執行就出現以下的錯誤訊息:
Application Error - The connection to the server was unsuccessful.
(file:///android_asset/www/index.html) 
 查了 Google 之後才發現, 這個問題可能是因為手機速度或是連網速度太慢, 超過 20 秒還無法將 index .html 載入 (連同 index.html 中所連結的外部檔案, 此例就是用了外部的 jQuery 與 jQueryMobile 檔案), 就會出現這個訊息。馬上測試一下, 把我的手機改成用 WiFi 連網, 果然就成功了, 後來發現原來同事用的 Samsing SIII 一直都是用 WiFi, 所以都沒有遇到過同樣的問題。

為了解決這個問題, 網路上有聰明的人把 index.html 改名字成 main.html, 另外加了一個 index.html, 這個 index.html 其實只是個空殼子, 用來轉址到 main.html, 也就是真正包含 App 內容的網頁:
<!doctype html>
<html>
 <head>
  <title>tittle</title>
  <script>
   window.location='./main.html';
  </script>
 <body>  
 </body>
</html>
這樣問題就解決了, 提供給大家參考, 不然總不能叫用你 App 的使用者都要改成 WiFi 連線才行吧!

星期一, 9月 03, 2012

Dreamweaver CS6 的 PhoneGap Build 服務與中文路徑名稱水土不服?

因為同事在測試 Dreamweaver CS6 的 PhoneGap Build Service, 之前用英文版都很正常, 可是一改成中文版的 Dreamweaver CS6 之後, PhoneGap Build 服務就沒成功過, 一直看到錯誤。但如果自己打包上 PhoneGap Build 網站上又都正常無誤, 感覺一整個奇怪, 沒道理到了中文版同樣的功能就不能用!

為了測試, 我也裝了 Dreamweaver CS6, 也是先試看看英文版, 果然沒問題。換到中文版, 把剛剛在英文版建好的網站拿來測試, 用 PhoneGap Build 服務重新建置, 沒問題啊!但是念頭一想, 那我用中文版建個新的網站來試試, 一試之下果然出現錯誤!

我想了一下, 看看建好的網站, 發現英文版與中文版唯一的差別是預設的網站儲存路徑一個是「Unnamed Site XX」, 一個是「未命名網站 XX」(XX 是序號), 這下我想不會是因為中文資料夾的原因吧?趕緊試一下, 果然, 只要路徑沒有中文,PhoneGap Build 服務馬上又恢復正常了。

我自己推測, 應該是 PhoneGap Build 服務會把整個網站的內容壓成 Zip 檔之類的, 再上傳到 PhoneGap Build 網站進行建置的工作, 但是路徑有中文的時候可能這個幕後的 Zip 檔檔名會因為編碼的關係變成莫名其妙的檔名, 導致後續的動作出錯吧?

如果你也在測試 Dreamweaver CS6 PhoneGap Build 服務的功能, 可以參考一下!