發表文章

目前顯示的是 5月, 2014的文章

【 Android 】Fragment

圖片
目前ECLIPSE開發的最新API版本為 19( android 4.4.2) Android是在Android 3.0 (API level 11)開始導入fragment的。 Fragment 可以將fragment想成activity中的模組,可每個fragment有自已的佈局,有自已的生命周期,而fragment的生命周期是嵌入在activity中的,意思是當activity被銷毀時,fragment也會被銷毀,所以fragment是不能單獨存在的,但一個activity可以擁有很多個fragment也可以載入或移除,當在運行時可以分別操作各個fragment。(若要詳細了解,請參考google developer ) 下列是一個簡單的fragment的範例,可以切換兩個fragment,layout的部份就不寫出來了: 1. 首先會在main activity中發現在新專案建立時,就會有一個fragment並在onCreate中載入,記住這裡是"載入"。 if ( savedInstanceState == null ) {      getSupportFragmentManager () . beginTransaction () . add ( R . id . container , new PlaceholderFragment ()) . commit () ; } 2. 實際的fragment在底下建立,在onCreateView當中將fragment的layout載入,並可以在這裡操作fragment上所有佈局的元件。 /** * A placeholder fragment containing a simple view. */ public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() { } @Override public View onCreateView( LayoutInflater inflater , ViewGroup container , Bundle ...

【 Android 】自定義listview按下時的顏色

圖片
ListView算是非常常用的一個view,所以常常有自訂項目的部份 這次因為專案需要所以試了一下自定義listview在item按下時的顏色,而不是預設的顏色, 但若是有設定背景圖案或是顏色就沒辦法有此效果。 1. 首先需要在drawable下建了一個xml檔,檔名自取但需要依照命名規則(如下圖),此處命名為"list_selector.xm" 注意在建立此檔案時,需選擇"selector",如下圖 2. 接下來在"list_selector.xml"裡可以自已的動作,此測試動作只有設定一個按下的動作而已,也可以自已其他的動作,如按住或是移動的時候。 <? xml version = "1.0" encoding = "utf-8" ?> < selector xmlns:android = "http://schemas.android.com/apk/res/android" >     < item android:drawable = "@android:color/black"             android:state_focused = "false"             android:state_pressed = "true" />     </ selector > 3. 接下來在listview的xml裡設定如下,即可以看到下列兩張圖的效果      android:background = "@drawable/list_selector"   還未按下時  按下後

【 Android 】自訂ActionBar

圖片
ActionBar 是自  Andoird 3.0(API level 11)  加入的新功能,目的在增進使用者操作介面更豐富並統一介面外觀;為了讓舊版本的 Android 也能有 ActionBar,又推出  appcompat v7  提供舊 Android 版本的 API,可往前支援到  Android 2.1( Éclair , API level 7) 。 1. 要修改actionbar的樣式可以開啟專案下的res/menu/main.xml,然後新增自已需要的action bar項目 < 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.hwfindme.MainActivity" >     < item         android:id = "@+id/additem"         android:icon = "@drawable/add"         android:title = "Add"         app:showAsAction = "always" />   //這行需要注意,要使用app開頭     < item         android:id = "@+id/action_settings"         android:showAsAction = "always...

Android 和 iOS 開發比較

參考來源 這篇文章有討論到andrid和ios的開發所不一樣的地方,簡單的分享一下自已的心得: 1. 在開發上:     iOS : 是以圖形界面來設計,所以非常的直觀和友善,而且只有ipohe和ipad兩種大小的相容性問題而已,所以ios的設計應該是取決於美術設計人員。     andorid : 相較於iOS的相容性,安卓在設計上必需面對大小不同解析度的問題,並無法有效的解決圖形在各個解析度所造成的layout偏差問題。 2. 在獲利上:      iOS :          a. 一年需付99usd。        b. 開發軟體 -> 蘋果品管後app store 上架 ->合理價格 ->消費者買單 ->開發商賺錢 ->開發新軟體,這是ios app的獲利方式,follow一定的規則就可以獲得獲利,雖然比較麻煩而且時間較長。     andord:        a. 終身只需付25usd。        b.  market上架時,google 沒品管, market 依各國法令客製化不佳,很多地方沒有付費機制。 很多app客戶會要求開發者設計app時參考ios的設計,又同時要求需要相容很多款裝置,這個根本對設計者來說是非常大的挑戰,因為對客戶或者使用者來說,根本不知道安卓在開發上根本就是不一樣的,一眛的要與ios比較當然顯得android的差,兩者當然可以比較,但不應該要求那方應該和那方一模一樣。      這篇文章也是成功人士的心得分享,可以參考:  http://www.ithome.com.tw/node/69897     

【 Android 】Lifecycle

圖片
既然Orientation那篇有用了生命週期來講解app的流程,這裡就順便記錄一下生命週期: 在android系統的裝置通常會有"上一步"和"HOME"鍵來操作系統(以HTC new ONE為例),如下: 一、上一步         若是按下上一步,生命週期的表現如下圖: 當按下上一步的時候,程式會destroy並finish掉,若是再開啟程式則會從oncreate重新執行 二、Home        若是按下home,生命週期的表現如下圖: 當按下home的時候,程式則會先跑onstop,若是再開啟程式則是會跑restart的部份 所以在程式的處理上,在這兩個動作發生的時候,應該作不一樣的設置處理。 PS: 若是按下back鍵不想回上一頁或是關掉app,可以實作下列動作: @ Override      public   boolean  onKeyDown ( int  keyCode,  KeyEvent  event )   {                   if   ( keyCode ==  KeyEvent . KEYCODE_BACK )          {              // Show home screen when pressing "back" button,              //  so that this app won't be closed accidentally             Intent intentHome =  new  Intent ( Intent. ACTI...

【 Android 】Orientation

圖片
APP Orientation 一開始從生命週期來看,當裝置發生螢幕翻轉的時候會怎麼跑,如下圖 紅色部份為程式一開始跑起來,藍色部份是發生轉向後的生命週期,表示andorid預設的轉向動作是會重新執行程式一次 若是不想要程式重新執行,則需要在Mainfast裡加上 android:configChanges = "keyboard|keyboardHidden|orientation|screenSize" 加上此控制項的位置(如下) android:name = "com.example.apitest.MainActivity" android:label = "@string/app_name" android:configChanges = "keyboard|keyboardHidden|orientation|screenSize"                                      在這裡需要注意的一點是,當API > 13的時候,需要多加"screenSize"這個控制項,否則會無效,當configChanges設定完成後,可以看到生命週期在轉向的時候改變了跑法(如下圖) 會發現當轉向的時候,是跑到onConfigurationChanged這個overwrite裡,不在重新執行程式。

【 Android 】Layout ICON 設計

圖片
在開發andorid應用app時,因為各個device的解析度不一定相同,所以layout上會有自適應的問題,主要會遇到的三個問題如下: 一、橫屏和直屏顯示的切換。         橫屏和直屏的解決方式如下:在res目錄下建立layout-port(直式)和layout-land(橫式)的目錄,裡面分別放上直式的佈局和橫式的佈局,而當裝置螢幕的方向改變的時候,系統會自動切換相對應的佈局。 二、圖片大小。         1. 在res的目錄下,基本上有三個資料夾可以存放不同尺吋的圖檔(如上圖)           【DPI是“dot per inch”的缩写,每英寸像素数。】          drawable-hdpi (高解析度): 854*480 、 800*480  (density 240)          drawable-mdpi(中解析度): 480*320  (density 160)          drawable-ldpi  (低解析度): 320*240   (density 120)         圖片設計的流程為: 先設計出mdpi的圖,再放大至150%( 240 / 160 = 1.5 )當hdpi的圖,縮小至75%( 120 / 160 = 0.75 )當ldpi的圖。          2. 另一種方式是可以借由該裝置的解析度並套用公式來算出適合該裝置的圖片大小              公式 :   screen pixels = file pixels * ( screen density / 160 ) ; /160是以mdpi為基準作計算; 此公式是在算設計出來的icon在每個大小不一樣的顯示器上顯示出來...

【 Android 】Listview 使用 BaseAdapter 並自訂 ImageButton

目的 : 再專案上使建立listview,並使用base adapter自訂view,同時在每個row上加上imagebutton。 問題 : imagebutton時有時無的反應。 原因 : 由於此專案需要一直更新listview上的資訊,所以在使用上會定時的更新(  setListAdapter( adapter );),而每更新一次則會掃一次listview有多少row,而listview上的imagebutton的監聽是在 adapter裡的getView裡,所以會一直被reset而造成按鍵無反應的狀態。 解決方式: 1.   待row上的資訊與新的資訊不符合時,再下 setListAdapter( adapter );去更新listview。 2. 在整個佈局加上                   android:descendantFocusability = "blocksDescendants" 。 3. 在imagebutton上加上                android:focusable = "false"             android:focusableInTouchMode = "false" 這樣imagebutton應該就可以很順暢的操作了。

【 Android 】Android 使用 SQLite

圖片
1.  SQLite : 以android的角度來說,是一個內建名為SQLite的關聯式資料庫引擎(Relational database engine); 而android應用程式的開發者則採呼叫API的方式來SQLite作溝通,同時,SQLite當中的資料庫是以單一檔案的方式儲存在手機硬體當中。 2.  Android開發不需另行安裝,只需要直接調用就好 3. 最大支援到2T bytes step 1: 先建立一個class叫作DBHelper 並繼承SQLiteOpenHelper,建立完後產生code之後如下: public class DBHelper extends SQLiteOpenHelper { final String createTable =   "CREATE TABLE iGauge " +   "(_id INTEGER PRIMARY KEY AUTOINCREMENT, " +   "name TEXT, mac TEXT, value TEXT)" ;    //資料表格式 public DBHelper( Context context , String name , CursorFactory factory , int version ) {        super ( context , name , factory , version ) ; } @Override public void onCreate( SQLiteDatabase db ) {         db . execSQL ( createTable ) ; //建立"createTable"這個資料表 } @Override public void onUpgrade( SQLiteDatabase db , int oldVersion , int newVersion ) { } } step 2: 建立控制介面:...

【 Android 】Activity 間全域變數共用的作法

在專案執行時遇到一個問題,就是我在A activity宣告的全域變數想要在B activity使用,但不知道該如何使用,目前有一試到一個方式是可行的: 下列是專案開發上遇到的問題和用法: A activity: public static DBHelper dbhelper ;  //宣告一個sql的helper 成 public static public static SQLiteDatabase db ;  / /宣告一個sql的SQLiteDatabase 成 public static B activity: private DBHelper dbhelper2 ;  //宣告一個sql的helper 成 private private SQLiteDatabase db2 ;  //宣告一個sql的 SQLiteDatabase  成 private dbhelper2 = MainActivity . dbhelper ; db2 = MainActivity . db ; 即可將A activity的變數在B activity裡使用; 這裡牽涉到一個小小的觀念: 所謂的public和private是為了控制類別外部的存取權而設定的東西,想像成權限; 當設成 private時,外部的類別就無法存取; 當設成 public時,外部的任何類別都可以存取; 而static是靜態的意思,是具有唯一的概念,不管被new幾個object,該值永遠都是一樣的。

【 Android 】 Graphicl Layout 空白

圖片
ADT下載更新之後,graphicl layout會變成空白,原本的layout排版都沒看到,所以程式碼就會出現一大堆錯誤,是由於無法連結到該元件,如下畫面: 處理如下: 1. 選擇 Help -> Install New Software. 2. 在Work with上輸入 : https://dl-ssl.google.com/android/eclipse/ 3. 選擇Developer Tools / Android Development Tools. 4. 選擇Next直到 Finish. 作上述處理,再重開ecilpse就可以看到原本的layout排版了!!!!