搜尋此網誌

2014年9月23日 星期二

【Android】onClick新舊方法比較

節錄自:
http://developer.android.com/reference/android/widget/Button.html
http://blog.chinatimes.com/tomsun/archive/2010/11/09/560824.html

Represents a push-button widget. Push-buttons can be pressed, or clicked, by the user to perform an action.
A typical use of a push-button in an activity would be the following:
 public class MyActivity extends Activity {
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);

         setContentView(R.layout.content_layout_id);

         final Button button = (Button) findViewById(R.id.button_id);
         button.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 // Perform action on click
             }
         });
     }
 }
However, instead of applying an OnClickListener to the button in your activity, you can assign a method to your button in the XML layout, using the android:onClick attribute. For example:
 <Button
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:text="@string/self_destruct"
     android:onClick="selfDestruct" />
Now, when a user clicks the button, the Android system calls the activity's selfDestruct(View) method. In order for this to work, the method must be public and accept a View as its only parameter. For example:
 public void selfDestruct(View view) {
     // Kabloey
 }
The View passed into the method is a reference to the widget that was clicked.
舊的方法:
以按鈕介面元件所提供的”setOnClickListener(View.OnClickListener)”方法,為該按鈕設置一個”OnClick監聽器”(OnClickListener)。
程式開發者才可以在該方法之中編寫”onClick(View)”方法裡頭的運算程式碼。
不過,這種方式除了會為這個”OnClick監聽器”多幾行程式碼之外,主要還會有一個缺點,那就是無論按鈕有沒有被按下,在應用程式被執行時,Android系統都需要為按鈕產生一個”OnClick監聽器”

假若,介面中有十個按鈕,那等於在”onCreate(Bundle)”覆寫方法被執行時,就要產生十個”OnClick監聽器”。

新的方法:
當手機用戶按下按鈕時,便會直接呼叫該按鈕的方法,並執行method 裡頭的程式運算動作。如此一來,就可免除了”OnClick”監聽器的使用。

因為,該對應之方法是獨立撰寫於”onCreate(Bundle)”覆寫方法之外,而非寫在”onCreate(Bundle)”覆寫方法裡頭。所以,當”onCreate(Bundle)”覆寫方法被載入時,Android系統並不會將它馬上載入Activity生命週期的運作當中。

不過,此法有個缺點,那就是Android 1.1(API Level 2)與Android 1.5(API Level 3)並不支援
宣告的method務必使用public

沒有留言: