2012年7月13日 星期五

About Google Support Library

我寫for android 3.0以上的程式要如何兼容於 android 3.0以下的手機呢?

Android 3.0 (HoneyComb) 前後在UI上有很大的更動,Google針對UI的部份提供了一些向前相容的辦法,像是Support Library v4。下圖便是同樣一支Support Library v4 demo sample 跑在4.0.4(左)與2.3.5(右)的差異。





這可以讓 Android 1.6以後的手機都能夠支援你針對android 3.0以上版本寫的app,Google提供了lib作自動轉換的動作。Google的 Support Library 支援以下幾種UI元件:




(Cited from http://developer.android.com/tools/extras/support-library.html)

有興趣的人可以參考一下 SDK/extras/android/support/ 的samples。 以 Support4Demos 為例,以下有幾點要注意一下:

  • If you add  "android-support-v4.jar" to the path Properties ->Java Build Path ->Libraries , please remember check the jar file in tab"Order and Export." Or you will see the errors.*1 (請記得要勾選 Order and Export內的lib檔案否則你會看見如*1附註的錯誤)
  • Please set the attributes for USE SDK like following: 
             uses-sdk android:minSdkVersion= 4 
             android:targetSdkVersion=" 11 "     (IF YOU USE V4 LIB)
  • Please set your "android target" beyond v.11.

第三點是因為Support4Demo的sample內的res/values-v11/下的sytles.xml在V 11以下不認得,因此無法build出來。使用V11以上的版本就好了。

不過ActionBar 卻未在支援之列,這部份就要參考一下SDK Samples下的 ActionBarCompat 範例。

*1 Errors from no export the library:

07-13 15:32:03.056: E/dalvikvm(5006): Could not find class 'com.example.android.supportv4.accessibility.AccessibilityDelegateSupportActivity$AccessibilityDelegateSupportView$1', referenced from method com.example.android.supportv4.accessibility.AccessibilityDelegateSupportActivity$AccessibilityDelegateSupportView.installAccessibilityDelegate


07-13 15:32:03.086: E/AndroidRuntime(5006): FATAL EXCEPTION: main
07-13 15:32:03.086: E/AndroidRuntime(5006): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.supportv4/com.example.android.supportv4.accessibility.AccessibilityDelegateSupportActivity}: android.view.InflateException: Binary XML file line #12: Error inflating class com.example.android.supportv4.accessibility.AccessibilityDelegateSupportActivity$AccessibilityDelegateSupportView
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1872)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1893)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.app.ActivityThread.access$1500(ActivityThread.java:135)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.os.Handler.dispatchMessage(Handler.java:99)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.os.Looper.loop(Looper.java:150)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.app.ActivityThread.main(ActivityThread.java:4385)
07-13 15:32:03.086: E/AndroidRuntime(5006): at java.lang.reflect.Method.invokeNative(Native Method)
07-13 15:32:03.086: E/AndroidRuntime(5006): at java.lang.reflect.Method.invoke(Method.java:507)
07-13 15:32:03.086: E/AndroidRuntime(5006): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
07-13 15:32:03.086: E/AndroidRuntime(5006): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
07-13 15:32:03.086: E/AndroidRuntime(5006): at dalvik.system.NativeStart.main(Native Method)
07-13 15:32:03.086: E/AndroidRuntime(5006): Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class com.example.android.supportv4.accessibility.AccessibilityDelegateSupportActivity$AccessibilityDelegateSupportView
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.view.LayoutInflater.createView(LayoutInflater.java:518)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
07-13 15:32:03.086: E/AndroidRuntime(5006): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:250)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.app.Activity.setContentView(Activity.java:1742)
07-13 15:32:03.086: E/AndroidRuntime(5006): at com.example.android.supportv4.accessibility.AccessibilityDelegateSupportActivity.onCreate(AccessibilityDelegateSupportActivity.java:47)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1836)
07-13 15:32:03.086: E/AndroidRuntime(5006): ... 11 more
07-13 15:32:03.086: E/AndroidRuntime(5006): Caused by: java.lang.reflect.InvocationTargetException
07-13 15:32:03.086: E/AndroidRuntime(5006): at java.lang.reflect.Constructor.constructNative(Native Method)
07-13 15:32:03.086: E/AndroidRuntime(5006): at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
07-13 15:32:03.086: E/AndroidRuntime(5006): at android.view.LayoutInflater.createView(LayoutInflater.java:505)
07-13 15:32:03.086: E/AndroidRuntime(5006): ... 21 more
07-13 15:32:03.086: E/AndroidRuntime(5006): Caused by: java.lang.NoClassDefFoundError: com.example.android.supportv4.accessibility.AccessibilityDelegateSupportActivity$AccessibilityDelegateSupportView$1
07-13 15:32:03.086: E/AndroidRuntime(5006): at com.example.android.supportv4.accessibility.AccessibilityDelegateSupportActivity$AccessibilityDelegateSupportView.installAccessibilityDelegate(AccessibilityDelegateSupportActivity.java:73)
07-13 15:32:03.086: E/AndroidRuntime(5006): at com.example.android.supportv4.accessibility.AccessibilityDelegateSupportActivity$AccessibilityDelegateSupportView.(AccessibilityDelegateSupportActivity.java:62)
07-13 15:32:03.086: E/AndroidRuntime(5006): ... 24 more

沒有留言: