Sean's Note: 7月 2013

2013年7月31日 星期三

Using ProGuard to remove Log

在開發 app 的過程中,我們常會用 Log.d 或 Log.v 印一些訊息,
這多多少少會影響應用程式的執行效能,所以在要 release apk 時,就可以
用上 ProGuard 的設定,來自動移除 Log。

ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier.

要啟用 ProGuard 的設定,要修改在專案路徑下的 project.properties 檔案內容,
加上一行 proguard.config=proguard-project.txt,指定 ProGuard 設定檔的路徑。
之後在 proguard-project.txt (ProGuard 設定檔) 裡,加上以下的敘述即可。

-dontwarn android.support.**
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

Releasing and signing an Android Application

使用 Eclipse 時,對著 project 按右鍵 -> Android Tools
可以選擇把我們的專案 export 成 signed/unsigned 的 apk 檔 :
-> Export Signed Application Package...
-> Export Unsigned Application Package...
而沒有 sign 過的 apk,只能安裝在 Emulator 上。


手動 sign 的方法可參考這篇:
http://www.androiddevelopment.org/tag/apk/

2013年7月25日 星期四

將 dip 轉換成 pixel

在 Android 手機裡,我們大都用 DIP(Density Independent Pixel unit) 來設計 UI 而非 pixel 值,
這時想將 DIP 轉換為 pixel,可直接套用下列的函式。
 
public int convertDIPtoPixel(int dp)
{
  final float scale = getResources().getDisplayMetrics().density;
  int pixels = (int) (dp * scale + 0.5f);
  return pixels;
}

公式: density = dpi/160, px = dp * density
density 是指每 dpi 代表多少 pixel,在 160 dpi 的裝置上,1 dpi = 1 pixel,density 為 1;
在 320 dpi 的裝置上,1 dpi = 2 pixel,所以 density 為 2。

詳見: http://developer.android.com/reference/android/util/DisplayMetrics.html#density

Layout 常遇見的問題

  1. alignParentBottom/alignParentTop/alignParentLeft/alignParentRight 這些屬性,如果在 parent 有設 padding 的屬性時,該 view 不會完全的與 parent 貼齊,而會留下 padding 的間距。
  2. layout_marginBottom 有時候會沒效果。
    http://stackoverflow.com/questions/10386036/why-is-layout-marginbottom-ignored-when-using-wrap-content

2013年7月9日 星期二

android.util.AndroidRuntimeException: You cannot combine custom titles with other title features

想要加入自訂義的 title bar 時,
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.main);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar);

卻跑出了這樣的錯誤訊息:

android.util.AndroidRuntimeException: You cannot combine custom titles with other title features

結果看到官網發現:

Beginning with Android 3.0 (API level 11), the action bar is included in all activities that use the Theme.Holo theme (or one of its descendants), which is the default theme when either thetargetSdkVersion or minSdkVersion attribute is set to "11" or greater.

也就是如果沒有特別指定 Theme,預設是用 Theme.Holo 這個主題,而這樣就已經包含了

Action Bar,Title Bar 和 Action Bar 兩者不能並存,所以只好在 title bar 的 style 裡加上 parent 

沒有 actionbar 的樣式 "android:Theme"

<style name="TitleBarTheme" parent="android:Theme">。

系統定義一些 theme 的詳細屬性,可以參考 themes.xml