2012年7月5日 星期四

Android 開發筆記 - 批次、大量設定按鈕事件偵測(setOnClickListener)

最近的案子很特別,除了一堆 Activity 外,每一個 Activity 裡頭又有一堆 Button/ImageButton 要處理,如果是依照一般教學文:


Button b = null;
if( ( b = (Button)findViewById( R.id.button01) ) != null )
        b.setOnClickListener( new Button.OnClickListener(){ /* ... */ } );
if( ( b = (Button)findViewById( R.id.button02) ) != null )
        b.setOnClickListener( new Button.OnClickListener(){ /* ... */ } );
...


假設有 20~30 個按鈕,就得用 findViewById 處理 20~30 次,程式碼就又臭又長。另一種作法則是把每個 Button/ImageButton 都設定為同一個 Button.OnClickListener 來管理,透過 View.getId() 來偵測,的確可以省記憶體,但還是不免要把 layout 上一堆按鈕都先 findViewById 一下,後來跟同事閒聊時,恰好提到用動態新增按鈕的方式,於是被 loop 關鍵字提醒一下,就來惡搞了:


void initOnClickListener() {


        int my_ids[] = {
                R.id.button01, R.id.button02, R.id.button03, ...
        };


        Button b = null;
        for( int i=0 ; i< ids.length ; ++i )
                if( ( b = (Button)findViewById( my_ids[i]) ) != null )
                        b.setOnClickListener(this);
}


public void onClick(View v) {
        switch( v.getId() ) {
                case R.id.button01:
                        break;
                case R.id.button02:
                        break;
                // ...
        }
}


其中的 this 就是指 MyActivity extends Activity implements OnClickListener,如此一來可以用最簡短的程式碼,很方便的初始化 layout 上頭的按鈕,也不用每個按鈕都 new Button.OnClickListener 出來,也會省記憶吧。這樣管理 Button/ImageButton 還滿方便的,只需把要偵測的按鈕,將其 R.id.name 擺在 array 裡頭,跑 loop 來解決就好啦。如果有用  PagerAdapter/ViewPager 實作 iOS PageControl 的話,更可以用多階層來管理:


final int cntView = 3;
int my_ids[][] = {
        {
                R.id.view1_btn1 , R.id.view1_btn2 , R.id.view1_btn3, ...
        } , 
        {
                R.id.view2_btn1 , R.id.view2_btn2 , R.id.view2_btn3, ...
        } ,
        {
                R.id.view3_btn1 , R.id.view3_btn2 , R.id.view3_btn3, ...
        }
}; 

for( int i=0 ; i<cntView ; ++i ) {
        for( int j=0 ; j<my_ids[i].length ; ++j ) {
                if( ( b = (Button)mPageView.get(i).findViewById( my_ids[i]) ) != null )
                        b.setOnClickListener( this );
        }


其中 mPageView 用來記錄每個 page 的 Activity 囉。


3 則留言:

  1. 請問這些碼要寫在哪裡

    回覆刪除
  2. 這篇只是提出一些概念而已 :)

    回覆刪除
  3. 以前都沒想到!最近碰到需要一個頁面處理300個imageview的問題,一直在想怎麼把這些東西串在一起,明明作得事情類似,卻只能用ID來識別。多了array index來控制圖片就輕鬆超多了!

    回覆刪除