2011年7月19日 星期二

在Android內實現Callback

寫JavaScript一定對CallBack的使用相當熟悉,但是當你要寫Java或Android
卻發現沒辦法把function當作參數傳給另一個function當CallBack用
因為在Java內並沒有function pointer,所以就有點麻煩
這時候可以用類似Observer的方式來做
簡單來說就是,既然無法丟一個function進去
那你可以把要執行的function放到一個物件內
把物件當參數丟進去就可以了

作法
一.建立公用的Observer Interface
利用Interface將允許使用的method定義出來

public interface IObserver{
    public abstract void success(Object data);
    public abstrcat void fail(String msg);
    public abstract void exception(String msg)
}

二.建立要使用的observer Class
把要做的工作在這這Class內實做出來
當然你也可以把這Class建立主(main)程式內,
這樣可以更方便

public class MyObserver implements IObserver{
    @override
    public abstract void success(Object data){
        ...
    };
    @override
    public abstrcat void fail(String msg){
        ...
    };
    @override
    public abstract void exception(String msg){
        ...
    }    
}

三.主程式應用
public class myApp{
    ....
    public void run(int status,IObserver observer){
        .....
        if(status==1){
            observer.success(data)
        }else if(status==2){
            observer.fail()
        }else{
            observer.exception("exception");
        }
    };
}

2011年7月18日 星期一

網頁上swf z-index操作

當在網頁上,同時存在多個swf檔案,若需要指定某一個強制在最上層
不受其他物件遮蔽,以下注意事項
一.wmode的影響
用來嵌入flash用的embed tag上的wmode值會決定swf在網頁上的顯示方式
1.當embed tag沒有設定wmode
  預設值為Window
  如果去偵測wmode值
  在FF與Chrome測到$("embed").attr("wmode")=false
  在IE則會得到$("embed").attr("wmode")='window'
2.設定wmode='opaque'
  才能讓swf所在的div可以依照HTML上做z-index排列,
  需設定
  embed tag attribute wmode='opaque'

二.動態改變wmode
要讓所有的Browser都可以動態改變wmode屬性值
若只是透過$("embed").attr("wmode","opaque")
是不可行的,
需要透過寫入整個innerHTML或outerHTML讓瀏覽器
重新顯示swf才會得到正確的顯示狀態
$("embed").each(function(i) {               
    embedTag = $(this).attr("outerHTML");        
    if ((embedTag != null) && (embedTag.length > 0)) {
        if (!$(this).attr('wmode') 11 $(this).attr('wmode')=="Window"){
            embedTag = embedTag.replace(">"," wmode='opaque'>");
            $(this).attr("outerHTML", embedTag);
        }        
    }       
});

三.設定swf的顯示位置
只需要改變swf所在div的z-index值,
即可調整其上下位置
$("#flashContainer").css("z-index",1000)

戀歌 - 義大醫院


這幾天剛搬好家,客廳比以前大上很多
以後 應該待在客廳裡看電視的機會應該會多一些
上網買了台 多媒體播放器,
測試著透國無線網路播放電腦裡的影片檔
一面陪著妹妹玩 一面讓電視播著最好的時光
聽著電視傳來 文夏的戀歌
又讓記憶突然又回到
老爸在醫院的那段時間

老爸住在義大醫院的隔離病房
與一般三人健保房比起來,空間大很多
因為隔離,沒辦法離開房間,只能透過窗戶 看著外面
對於習慣在山上到處走騎車跑步的他
我知道他身體的痛 還有失去自由的那份難過

老爸想聽歌
大弟買了個小小的放音機
放在床邊 反覆的播放著 這些 台語老歌
在山上 老爸是坐在戶外的躺椅上
看著遠方的風景
這時候的他
只是躺在病床上 看著天花板
在音樂裡找到與過去生活連結的一部分
這個小小的收音機
就這樣跟著我爸 在醫院間來來回回

2011年7月13日 星期三

自訂ListView Item

在ListView,要用自訂item樣式,
通常在Android內,我們需要以ListView顯示資料列表
列表內item的樣式可以直接使用android內建的item樣式
例如R.android.layout.simple_list_item_1
但如果希望使用自行設計的item樣式,可以透過自訂Adpater來做
以下是設計流程

1.設計Item layout XML
要顯示的itemㄝ,以一個layout xml檔案設計所要呈現的樣式

 <?xml version="1.0" encoding="utf-8"?>  
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
           android:layout_width="fill_parent"   
           android:layout_height="wrap_content"  
           android:orientation="horizontal">  
           <ImageView android:id="@+id/item_img"  
                android:layout_width="60dp"   
                android:layout_height="60dp"/>                 
           <TextView   
                android:layout_width="wrap_content" android:layout_height="wrap_content"            
                android:id="@+id/item_title" />  
      </LinearLayout>       
2.自訂Adapter
透過自行設計的Adapter將資料與item xml結合顯示
1.extends BaseAdapter
2.在建構子內設定希望傳入的各項資料欄位
public MyAdapter(Context context,String[] title,String[] img){
  inflater = LayoutInflater.from(context);
  item_title=title;
  item_img=img;
}
3.在Adapter內改寫getView()
透過getView取得的position當index
再由建構子取得的資料array內得到各item所要顯示的資料
將這item資料帶到view內
@Override
public View getView(int position, View convertView, ViewGroup parent) {
   //--將item xml轉成view物件,並取得item內各項元件的view 
   convertView = inflater.inflate(R.layout.list_item,null);
   TextView title_view=(TextView)convertView.findViewById(R.id.item_title); 
   title_view.setText(item_title[position].toString());  

   ImageView img_view=(ImageView)convertView.findViewById(R.id.item_img);
   Drawable drawable = LoadImageFromWeb(item_img[position]);
   img_view.setImageDrawable(drawable);  

   return convertView;  
}
4.顯示ListView
要顯示ListVIew的Activity可以直接繼承ListActivity
繼承自ListActivity即已包含了一個list view在裡面
public class PushActivity extends ListActivity {
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);        
      //---set List View---- 
      ListView lv=getListView();       
      LayoutInflater inflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);       
      //--Add Data--------------------
      String[] songData=getResources().getStringArray(R.array.songdata_holder);
      String[] songImg=getResources().getStringArray(R.array.songimg_holder);
      MyAdapter adapter = new MyAdapter(this,songData,songImg);        
      setListAdapter(adapter);
    } 
}