2012年2月16日 星期四

GridView Null Pointer Exception

error log:
 W/dalvikvm( 727): threadid=1: thread exiting with uncaught exception (group=0x2aac47e8)  
 E/AndroidRuntime( 727): FATAL EXCEPTION: main  
 E/AndroidRuntime( 727): java.lang.NullPointerException  
 E/AndroidRuntime( 727):    at android.widget.GridView.setupChild(GridView.java:1246)  
 E/AndroidRuntime( 727):    at android.widget.GridView.makeAndAddView(GridView.java:1222)  
 E/AndroidRuntime( 727):    at android.widget.GridView.makeRow(GridView.java:265)  
 E/AndroidRuntime( 727):    at android.widget.GridView.fillDown(GridView.java:218)  
 E/AndroidRuntime( 727):    at android.widget.GridView.fillSpecific(GridView.java:482)  
 E/AndroidRuntime( 727):    at android.widget.GridView.layoutChildren(GridView.java:1122)  
 E/AndroidRuntime( 727):    at android.widget.AbsListView.onLayout(AbsListView.java:1147)  
 E/AndroidRuntime( 727):    at android.view.View.layout(View.java:7085)  
 E/AndroidRuntime( 727):    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:909)  
 E/AndroidRuntime( 727):    at android.view.View.layout(View.java:7085)  
 E/AndroidRuntime( 727):    at android.widget.AbsoluteLayout.onLayout(AbsoluteLayout.java:120)  
 E/AndroidRuntime( 727):    at android.view.View.layout(View.java:7085)  
 E/AndroidRuntime( 727):    at android.widget.FrameLayout.onLayout(FrameLayout.java:333)  
 E/AndroidRuntime( 727):    at android.view.View.layout(View.java:7085)  
 E/AndroidRuntime( 727):    at android.widget.FrameLayout.onLayout(FrameLayout.java:333)  
 E/AndroidRuntime( 727):    at android.view.View.layout(View.java:7085)  
 E/AndroidRuntime( 727):    at android.widget.FrameLayout.onLayout(FrameLayout.java:333)  
 E/AndroidRuntime( 727):    at android.view.View.layout(View.java:7085)  
 E/AndroidRuntime( 727):    at android.view.ViewRoot.performTraversals(ViewRoot.java:1045)  
 E/AndroidRuntime( 727):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)  
 E/AndroidRuntime( 727):    at android.os.Handler.dispatchMessage(Handler.java:99)  
 E/AndroidRuntime( 727):    at android.os.Looper.loop(Looper.java:123)  
 E/AndroidRuntime( 727):    at android.app.ActivityThread.main(ActivityThread.java:4627)  
 E/AndroidRuntime( 727):    at java.lang.reflect.Method.invokeNative(Native Method)  
 E/AndroidRuntime( 727):    at java.lang.reflect.Method.invoke(Method.java:521)  
 E/AndroidRuntime( 727):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)  
 E/AndroidRuntime( 727):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)  
 E/AndroidRuntime( 727):    at dalvik.system.NativeStart.main(Native Method)  
log有點難看出是哪段程式碼出了問題,只知道GridView出了問題,通常這種問題都是出現在getView的時候回傳null值產生,所以一定要避免漏接了null的View
 if (xxxView = = null)  
  {  
    ...  
 }   
參考網址

2012年2月15日 星期三

提高背景圖的設定

在一般手機螢幕的圖檔,其實解析度稍微低一些,並不會太明顯。
但是在電視的環境就會要更高的要求。
因此要求出圖的設計師都要提供32bit圖檔。
但是android預設的解析度是 RGB_565,因此要另外更改設定成ARGB_8888才行,否則會有color loss的狀況。


我的狀況是在背景圖,可以用下面的code來設定。
Code:

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;   
        Bitmap myBitmap =BitmapFactory.decodeResource(mContext.getResources(),R.drawable.m_background,options);  
        BitmapDrawable bd = new BitmapDrawable(this.getResources(), myBitmap);
        youview.setBackgroundDrawable(bd);


當然,為大幅增加記憶體用量,要同時使用gc的機制會比較安全~

2012年2月9日 星期四

如何移除與置換預設Launcher


如果想要把預設的Launcher給換掉,可以利用以下方法

使用adb工具,下以下指令:

adb remount

adb shell rm system/app/Launcher2.apk

adb uninstall com.android.launcher

adb install Launcher_xxx.apk (or use eclipse Run ..)

這樣就可以了喔~

Android如何找到最適合的資源檔

參考官方的說明:How Android Finds the Best-matching Resource


1. 消除和設備設定不符合的資源資料夾(qualifier),例如語言設定為en,就會把 fr-rCA消除掉
    drawable/
  drawable-en/
  drawable-fr-rCA/
  drawable-en-port/
  drawable-en-notouch-12key/
  drawable-port-ldpi/
  drawable-port-notouch-12key/

  例外:螢幕解析度在這個階段是唯一衝突但是不會刪的資源資料夾,例如device是hdpi但是ldpi還是會留著 。(想瞭解更多請參考Supporting Multiple Screens)

2.選擇下一個最高順位的qualifier
(最高是 MCC,MNC,Language...) 請參考這個table的順位 
3.有沒有符合的資料夾,沒有就回到上一步直到找到。
4.消除掉沒有最高順位qualifier的資源資料夾,例如:把沒有語言qualifier的資料夾都消掉。
  drawable/
  drawable-en/
  drawable-en-port/
  drawable-en-notouch-12key/
  drawable-port-ldpi/
  drawable-port-notouch-12key/
  例外:如果qualifier和螢幕解析度有不符合的狀況,Android會自動選擇最符合設備螢幕密度的qualifier,一般來說andorid會選擇把高解析度的圖檔給縮小,而不是把低解析度的讀檔給放大。
5.再回到2,直到刪到只剩下一個資源資料夾。





2012年2月8日 星期三

Android View ScrollBar 設定


WebView 和 GridView的ScrollBar 設定

.setVerticalScrollBarEnabled(false);  //取消Vertical ScrollBar顯示

.setHorizontalScrollBarEnabled(false); //取消Horizontal ScrollBar顯示

.setScrollBarStyle(View.SCROLLBARS_XXX) ;// 設定ScrollBar樣式

樣式請參考這裡

.setHorizontalScrollbarOverlay(boolean overlay);
//設定Horizontal ScrollBar是否覆蓋樣式

.setVerticalScrollbarOverlay(boolean overlay);
//設定 Vertical ScrollBar  ScrollBar是否覆蓋樣式