2012年8月27日 星期一

點擊map上的標記時變更圖案


在map上點擊某個標記時,想讓該標記變更圖示,以便使用者辨別目前點選的項目,可以使用以下作法。



 protected boolean onTap(int index) {
    OverlayItem item = mOverlays.get(index);
    //Get the new Drawable
    Drawable marker = mContext.getResources().getDrawable(R.drawable.icon);
    //Set its bounds
    marker.setBounds(0,0,marker.getIntrinsicWidth(),marker.getIntrinsicHeight());
    //Set the new marker
    item.setMarker(marker);
    //Return true! Do not invalidate
    return true;
}


但如果你在ItemizedOverlay<OverlayItem>裡面原先是將Drawable設置為super(boundCenterBottom(defaultMarker))的話,會發現點擊後雖然變色了但是圖示移位了,這時在setBounds的地方必須設置以下(也就是boundCenterBottom的意思)

int dWidth = drawable.getIntrinsicWidth();


int dHeight = drawable.getIntrinsicHeight();


marker.setBounds(-dWidth / 2, -dHeight, dWidth / 2, 0);





做到這裡發現如果點擊下一個marker,上一個marker沒有變回來,我自己使用以下方式


 OverlayItem item = items.get(arg0);
  Drawable marker = context.getResources().getDrawable(R.drawable.map_pin);
  Drawable markers = context.getResources().getDrawable(R.drawable.map_pins);
     int dWidth = marker.getIntrinsicWidth();
     int dHeight = marker.getIntrinsicHeight();
     marker.setBounds(-dWidth / 2, -dHeight, dWidth / 2, 0);
     markers.setBounds(-dWidth / 2, -dHeight, dWidth / 2, 0);


  //如果點擊的跟之前點擊的物件不同,恢復上一支旗標的顏色,變更目前點選旗標顏色
  if(arg0!=itemPotiion){
 
   //恢復上一支旗標的顏色
   if(itemPotiion!=-1){
    OverlayItem before_item = items.get(itemPotiion);
    before_item.setMarker(marker);
   }
   //變更目前旗標顏色
   item.setMarker(markers);
  }
  itemPotiion=arg0;//記錄點選的項目




參考網址:
http://pastebin.com/eAhEHssQ
http://stackoverflow.com/questions/7038636/how-to-change-the-marker-for-the-overlay-on-tap-for-android

2012年8月15日 星期三

使用try偵測EditText的值是否為數字


   如果我想偵測某個EditText是否為全部數字且要在0~100間的話要怎麼做呢?設定EditText輸入的格式後,當然我知道大家都會說這很簡單阿,但分享一下我覺得很聰明的方式。



如果輸入的不是數字,那麼在Double.parseDouble時會錯誤,則會跳到catch 去顯示Dialog,不符合0~100時,也會到catch 去顯示Dialog,這樣程式碼真簡潔。


         try
          {
            first_rate = Double.parseDouble(rate1.getText().toString());
            if (first_rate < 0 || first_rate > 100)
            {
              throw new Exception();
            }
          }
          catch (Exception ex)
          {
            ShowDialog("錯誤","格式錯誤, 請輸入 0 ~ 100 之間的數字");
           
 
          }



顯示的Dialog的方法


  private void ShowDialog(String title,String msg)
  {
    AlertDialog.Builder builder = new Builder(getActivity());
    builder.setTitle(title);
    builder.setMessage(msg);
    builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
   
      public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
     
      }
    });
    Dialog noticeDialog = builder.create();
    noticeDialog.show();
 
  }


2012年8月12日 星期日

Java單例模式(可以減少Andoroid記憶體使用量)

如果有個類別常常使用,那要使用時都必須再new出一個類別,但如果一龐大起來,也許會造成資源不必要的浪費,或許善用static是一個方法,如下:
 
public class Singleton {
 //3.建立一個靜態的類別,直接在這邊建立只會一次。
 private static Singleton instance=new Singleton();
 
 //1.私有化建構方法,這樣就不能new出本類別。
 private Singleton(){
  
 }
 
 //2.定義一個方法堤供用戶端產生好的實例
 public static Singleton getInstance(){
  
  return instance;
  
 }
 public int getCount(int x,int y){

  return x+y;
  
 }
}
public class Client {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Singleton aa=Singleton.getInstance();
  System.out.println(aa.toString());

  Singleton bb=Singleton.getInstance();
  System.out.println(bb.toString());
  
  
  System.out.println(aa.getCount(5, 5));
  

 }

}
這樣一來,你會發現System.out.println(aa.toString())跟bb時,他們的記憶體位置是一樣的,這樣能夠有效減少記憶體使用量。 

後續還有一堆很深的意義可以去思考,例如假設有個需求,假設某些資源取得頻繁時,我們可以去定義一個靜態的Map當作資料快取,要取得資料時:
(1)檢查map記憶體位置中是否有資料,如果有直接使用map記憶體裡面得資料值。
(2)如果記憶體位置中沒有值,我們可以從服務器或sqlite去取得資料,取得完後再存入map記憶體中以便下次使用。
這讓我想到在Android上使用google map時,一移動地圖就要從服務器撈取大量座標要標註在地圖上的時候,是不是也能夠使用此邏輯去增加再次顯示的速度?


 看完王者歸來-品味 Java 的 21 種設計模式後,自己紀錄的心得。

星期、月份英文縮寫

中文 英文 3字母 縮寫 3字母 縮寫 2字母 縮寫 2字母 縮寫 1字母 縮寫 1字母 縮寫 其他 縮寫 星期日 Sunday SUN Sun SU Su S S 星期一 Monday MON Mon MO Mo M M 星期二 Tuesday TUE Tue TU ...