2014年8月21日 星期四

Android 開發(六十五) Gradle 出現 unable to locate a java runtime to invoke

在command line key這些指令之後
$ chmod +x ./gradlew
$ ./gradlew assembleDebug
再重新build即可

目前還不知道為何會發生這個事情...

Android 開發 (六十四) Gradle replace and copy file

在prebuild時要如何修改 xml 裡的檔案?
例如  我們有個buildvalue變數  希望在build的時候做修正




首先必須先創建一個template 接著template中的字串做match 並replace之後將檔案複製到原本的build folder中










照著上面的方法寫,我們必須手動的在build之前打入指令
gradle myCopy
然後等到他完成之後才可以執行 grdle build
也就是說task並不會自動被執行

所以我們可以在gradle file中加入






這代表著在prebuild之前必須先執行 myCopy結果如下
















:app:myCopy代表有跑到myCopy這個task
這樣就會完整執行到我想做的事情了

Android 開發 (六十三) Gradle Flavor

Flavor  利用flavor 可以修改 packageName versionCode versionName
在build.gradle 下新增 productFlavors 設定希望的值
並且在Manifest中做相關設定即可
例如   applicationId 在這邊為 packagename   然後在 manifest中 將參數寫成 ${applicationId}  在build的時候就會置換































利用上面的方式,我們能夠輕鬆的替換package name
接著該如何利用不同的flavor替換不同的ui呢?


假設我們有100間店,以及1000種ui
那我們就需要兩個參數來控制色碼和店家
首先我們先在 flavorDimensions  中定義 color and shopNum 




接著定義各個color 以及 shopNum要吃的參數
如下  color1的 flavorDimension 為color代表著  color1 是代表color參數而
shop1 的 flavorDimension為 shopNum代表著 shop1代表著shopNum的參數
可以看到我們在color1 以及shop1 中各定義了一些參數














由於我們必須換圖 為了達到這個目的,我們只需要在folder中創建 color1 and color2 














接著當我們要build的時候  只需點選左下角的 build Variants  接著選取我們要build的項目即可,
color1Shop1Debug  or  color2Shop2Debug ...etc

2014年8月14日 星期四

Android 開發 (六十二) Drawable mutate

先看一下這段code

public static class MyAdapter extends BaseAdapter {
   private LayoutInflater inflater;

   public MyAdapter(Context context) {
    inflater = LayoutInflater.from(context);
   }

   @Override
   public int getCount() {
    // TODO Auto-generated method stub
    return 10;
   }

   @Override
   public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
   }

   @Override
   public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return 0;
   }

   @Override
   public View getView(int arg0, View arg1, ViewGroup arg2) {
    View view = inflater.inflate(R.layout.listview_layout, null);
    CheckBox check = (CheckBox) view.findViewById(R.id.check);
    Drawable d= inflater.getContext().getResources()
      .getDrawable(R.drawable.icon_item_small_selected);
    if (arg0 == 1) {
     d.setAlpha(255);
    } else {
     d.setAlpha(70); 
    }
    check.setButtonDrawable(d);

    return view;
   }

  }

看起來非常的正常,只不過是在position為1的時候將透明度改成255其他時候為70
但是結果是如下面這張圖...  我們會發現position 1的透明度竟然不是255.....







這其實是因為當getdrawable取得同一張圖時其實是共用resource而且共用state ,
所以當你針對某一張圖做更改時,其實同時也改到了其他共用的view


那要怎麼解決?    mutate 

接著讓我們將原本的code 加入 mutate


   @Override
   public View getView(int arg0, View arg1, ViewGroup arg2) {
    View view = inflater.inflate(R.layout.listview_layout, null);
    CheckBox check = (CheckBox) view.findViewById(R.id.check);
    Drawable d = inflater.getContext().getResources()
      .getDrawable(R.drawable.icon_item_small_selected);
    if (arg0 == 1) {
     d.mutate().setAlpha(255);
    } else {
     d.mutate().setAlpha(70); 
    }
    check.setButtonDrawable(d);

    return view;
   }

讓我們再看一次結果


everything works.

2014年8月13日 星期三

Android 開發 (六十一) Splash Screen

不知道各位是否有遇過,打開APP時總是一片空白,或者是start一個新的activity時,畫面總是空白,如下圖所示,在app開起的瞬間是一片白色畫面,過了幾秒鐘之後,所有的ui才一起出現,這其實並不是BUG,而是android先去load了 activity的 Theme之後才去讀取你的App畫面。



既然知道問題的原因,那要解決這個問題的辦法也很簡單,我們只需要將開啟app時所load的Theme換掉就好了。

可以看到從一打開app我們想顯示的logo就一直存在,再也沒有白畫面的問題,
這樣就可以製作出Splash Screen了。

好了,原理講完了,接著就是該如何實作,
首先要先製作Splash Screen的頁面



<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <shape android:shape="rectangle" >
            <solid android:color="#FFFFFF" />
        </shape>
    </item>
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/ic_launcher" />
    </item>

</layer-list>

接著客制化我們的Style
    <style name="myTheme" parent="Theme.AppCompat.Light">
        <item name="android:windowBackground">@drawable/mylayer</item>
    </style>

接著將我們的style套到我們的Activity上

        <activity
            android:name="com.yesnews.sample.MainActivity"
            android:label="@string/app_name"  
            android:theme="@style/myTheme"
            >

           ......


如此就大功告成了!!
我們想要的Splash Screen不再會有白畫面的問題了~