2015年12月18日 星期五

Snackbar vs Translucent mode

當 Navigation 設定成 Translucent mode 時
snackbar 會跟 navigation bar 重疊
不知道為啥 Google 設計 design library 時沒考慮到這件事

private int mNaturalBarHeight = 0;
int idShowNavigation = Resources.getSystem().getIdentifier("config_showNavigationBar", "bool", "android");
    boolean isShowNavigationBar = Resources.getSystem().getBoolean(idShowNavigation);
int navigationId =  getContext().getResources().getIdentifier("navigation_bar_height", "dimen", "android");
if (isShowNavigationBar && navigationId > 0) {
    mNaturalBarHeight = getContext().getResources().getDimensionPixelSize(navigationId);
}

要顯示 snackbar 時,改動 layout parameter

final Snackbar snackbar = Snackbar.make(mFab, R.string.msg_to_show, Snackbar.LENGTH_LONG)
        .setAction(R.string.action_to_show, new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO: go to something
            }
        });
View v = snackbar.getView();
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) v.getLayoutParams();
layoutParams.bottomMargin = mNaturalBarHeight;
v.setLayoutParams(layoutParams);
snackbar.show();

2015年7月9日 星期四

Android Studio vs Yosemite

昨天為了讓 Xcode 升到最新版
終於讓 2011" MBA 去升 Yosemite
系統變慢是正常的
Android Studio 結束後有 java zombie process
而且整個記憶體吃很兇
不過最讓我無法忍受的是 Android Studio 的字型變得超醜

搞了半天原來是 Java 7/8 的問題 依據官方的網頁

  • Android Studio 要跑 Java 6
  • compiler 要跑 Java 7/8

他裡面有寫要 export STUDIO_JDK
不過我試的結果是直接裝完 java 6 他就會自動去吃了

Apple Java 6 link
用了 Java 6 後
Android Studio 的速度跟吃 RAM 都變正常一點了

2015年6月3日 星期三

Google Photos

Google Photos ...

  • 用 Google+ / Picasa 上傳高畫質的他還是會縮成 2048x2048 以下 要用 Google Photos 設定成高畫質(還是不能是原始檔), 不然還是會佔空間, 3648x2432 的圖 2.9MB → 977 KB, 所以上傳後還是會縮圖
  • Google Photos 上傳時要選上傳照片,他整個傳完後才會問你要不要新增相簿
  • 他的網頁版 UI 其實不是很好用, 要 Social 方便還是得用 Google+ 的界面
  • Google photos 的修圖功能不若 Google+ 上的完整

結論

  • 用 Google photos 上傳, 用 Google+ 相簿分享 / 修圖
  • 用 flickr 備份原始檔(有 1T 免費)
  • 等 Google Photo 改進

PS.
Google Photos: http://photos.google.com/
Google+ Photos: https://plus.google.com/photos/ 會被導向,要按返回

2015年5月11日 星期一

leakcanary

今天看到有人在討論的工具 library

leakcanary

如他的名字, 他是拿來試毒氣的金絲雀
主要是把 MAT (Memory Analyzer) 做進去 application level

Getting Started

dependencies {  
   debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'  
   releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'  
}  

PS. 我的 build.gradle 一直少加了

repositories {  
    mavenCentral()  
}  

結果 dependencies 一直出問題
加了後,他會自己去抓 library 了

public class ExampleApplication extends Application {  
  @Override public void onCreate() {  
       super.onCreate();  
       LeakCanary.install(this);  
  }  
}  

到此為止, 他做了什麼

他埋了一個 Activity Watch 在 Application level
所以當你的 Activity finish() 了, 一但 Activity 沒有被正確回收
他就在背景做 heap dump
利用 Eclipse 的 MAT(Memory Analyzer) 去分析是誰 block 住
activity 這個 reference 是誰造成 memory leak

然後他會在 notification dump 出 memory leak 的結果
拉下來點開就有一個分析的畫面跟你說哪邊 memory leak

然後要怎用

可以隨時利用他

refWatcher = LeakCanary.install(this);

寫個 getter 把 refWatcher export 出來

RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());

然後監控你要的變數

refWatcher.watch(schrodingerCat);

薛丁格的貓 被 clear 掉,卻沒有正常被 gc 掉的話
就會觸發 notification

另外因為 heap dump 需要幾秒鐘
所以會等一下才跑出來

2015年3月17日 星期二

日本賞櫻大爆走

2015 年賞櫻計畫

猶豫不決,龜龜毛毛
結果機票有點貴
不過後來還是花錢買了
3/28~4/9 關西機場進,成田機場出

  • 3/28 下午的飛機,到難波已經要睡了
  • 3/29 姬路城, 明石公園, 夙川綠地
  • 3/30 萬博公園, 毛馬桜之宮公園, 大阪城
  • 3/31 奈良: 郡山城跡, 興福寺, 冰室神寺, 奈良公園, 宇治
  • 4/1 京都: 嵐山, 天龍寺, 仁和寺, 二条城 or 平野神社夜櫻
  • 4/2 京都: 醍醐寺, 山科疏水, 衹園週邊, 哲學之道

很自虐的夜巴到東京

  • 4/3 東京市內
  • 4/4 東京市內
  • 4/5 東京市內
  • 4/6 河口湖
  • 4/6 河口湖
  • 4/7 東京市內
  • 4/8 鎌倉一日遊
  • 4/9 東京市內

看這行程能成功多少

2015年3月12日 星期四

Signing release key in AndroidStudio

Put this into ~/.gradle/gradle.properties

RELEASE_STORE_FILE={path to your keystore}
RELEASE_STORE_PASSWORD=*****
RELEASE_KEY_ALIAS=*****
RELEASE_KEY_PASSWORD=*****

注意!RELEASE_STORE_FILE 的路徑要是絕對路徑 Android Studio 很笨的會把 ~/.... 串起來, 然後找不到

signingConfigs {

   release {
       storeFile file(RELEASE_STORE_FILE)
       storePassword RELEASE_STORE_PASSWORD
       keyAlias RELEASE_KEY_ALIAS
       keyPassword RELEASE_KEY_PASSWORD
   }
}

buildTypes {
        release {
            signingConfig signingConfigs.release
        }
}

ref: StackOverflow

2015年2月11日 星期三

Android Studio multiple sourcesets problem

解決了一個困擾我三個月的事...

gradle 可以把 src code 分成不同的目錄
然後可以用 build variants 分別去要不要 include 這個東西

android.sourceSets.main {}  
android.sourceSets.XXX {}

因為我們現在開發只會用到 XXX
main 也被污染了, 一定要用到 XXX 裡的 code

每次 import project 時,我的 Mac 總是會選到 XXX 的 build variants
所以我的 Android Studio 可以 build 出來
用指令 gradle build 也是正常...

可是其它人的 Windows 總是會選到 main 的那個 build variants
所以他們總是 build 不過 (不過我重灌後的 Windows 上竟然可以!?)
只能改 gradle 把 XXX 裡的目錄加到 main 裡

可是這樣 Project view 時沒辦法把 src set 切開看,很醜

... 反正結論就是 UI 上把 build variant 選成 XXXDebug 就好了
害我為了要看不同 src set local 的 gradle 檔要跟別人不一樣
(只有我用 Mac)

今天為啥會解決這件事呢...
因為我的 Android Studio project 突然爛了
重 import source set 竟然跑回 main 了
而且怎弄都是這樣
才又把 windows 上的 iml 檔拿來 diff
靈機一動想到這回事
原來只是我運氣好(!?) ... -___-

這鳥東西竟然困擾我三個月
幹!

太蠢了,寫起來記錄