電話撥號器之點擊事件的優(yōu)化
按鈕的點擊事件有多種寫法,下面就不同的寫法進行講解。
編寫內(nèi)部類
在項目中編寫電話撥號器的點擊事件時,我們是通過新建一個MyButtonListener的內(nèi)部類來實現(xiàn)的。如圖1-1是我們的處理方式,這種處理方式有什么弊端呢?假設(shè)我們的界面中有多個按鈕,這就意味這我們需要寫多個內(nèi)部類了,很明顯,這種做法是不合理的。
// 找到一個關(guān)系的按鈕
Button bt_dail =(Button) findViewById(R.id.bt_dail);
// 給按鈕注冊一個點擊事件的監(jiān)聽事件
bt_dail.setOnClickListener(new MyButtonListener());
圖1-1所示
編寫匿名內(nèi)部類
上述方法是按鈕點擊事件的第一種寫法,當(dāng)界面按鈕很少時可以使用這種設(shè)計方式。下面是按鈕點擊事件的第二種寫法,該方法是通過編寫該按鈕的匿名內(nèi)部類來實現(xiàn)其點擊事件的。如圖1-2所示:
bt_dail.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String number = et_phone.getText().toString().trim();
if ("".equals(number)) {
Toast.makeText(MainActivity.this, "電話號碼不能為空", Toast.LENGTH_SHORT).show();
} else {
// 撥打電話,激活系統(tǒng)的撥打電話應(yīng)用,把電話號碼傳給系統(tǒng)的應(yīng)用。
Intent intent = new Intent();// 新建一個意圖
intent.setAction(Intent.ACTION_CALL);// 設(shè)置意圖要執(zhí)行的動作
intent.setData(Uri.parse("tel:" + number));// 設(shè)置意圖執(zhí)行動作的對象
startActivity(intent);// 開啟這個意圖
}
}
});
圖1-2所示
圖1-2是直接編寫點擊按鈕的匿名內(nèi)部類,然后實現(xiàn)該匿名內(nèi)部類的方法來完成點擊事件的響應(yīng)事件。對于撥打電話這個響應(yīng)事件,我可以把它封裝成一個方法。如圖1-3所示,這樣來整個代碼就顯的更加整潔。
private void callPhone() {
String number = et_phone.getText().toString().trim();
if ("".equals(number)) {
Toast.makeText(MainActivity.this, "電話號碼不能為空", Toast.LENGTH_SHORT)
.show();
} else {
// 撥打電話,激活系統(tǒng)的撥打電話應(yīng)用,把電話號碼傳給系統(tǒng)的應(yīng)用。
Intent intent = new Intent();// 新建一個意圖
intent.setAction(Intent.ACTION_CALL);// 設(shè)置意圖要執(zhí)行的動作
intent.setData(Uri.parse("tel:" + number));// 設(shè)置意圖執(zhí)行動作的對象
startActivity(intent);// 開啟這個意圖
}
}
圖1-3所示
使Activity實現(xiàn)點擊事件的接口
第二種方法比第一種方法要優(yōu)化很多,但是也存在一些問題。假設(shè)按鈕特別多時,我們就得寫多個匿名內(nèi)部類。很顯然,這種做法也是不合理的。為此我們可以讓當(dāng)前Activity實現(xiàn)點擊事件的接口,然后重寫該接口中的方法來處理點擊事件的響應(yīng)。
l Activity如何實現(xiàn)點擊事件的接口,如圖1-4所示:
public class MainActivity extends Activity implements OnClickListener{
private EditText et_phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.phone_ui);
.......
圖1-4所示
l 重寫接口中的方法
// 點擊事件的第三中方法
@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.bt_dail:
callPhone();
break;
default:
break;
}
}
圖1-4所示
在重寫方法中通過判斷點擊按鈕的id來確定點擊的是哪一個按鈕,從而進行不同的事件響應(yīng)。這時監(jiān)聽事件的添加要按如圖1-5所示來編寫:
Button bt_dail = (Button) findViewById(R.id.bt_dail);
// 給按鈕注冊一個點擊事件的監(jiān)聽事件
bt_dail.setOnClickListener(this);
圖1-5所示
xml文件來定義Button的點擊事件
第三種方法要比第二種方法優(yōu)化很多,當(dāng)依舊存在問題。假設(shè)界面中有100個按鈕這就意味著我們在swith中做100次判斷,很顯然這種方法是不可取的。為此我們可以在定義xml布局文件時給相關(guān)的按鈕注冊監(jiān)聽。如圖1-6為注冊監(jiān)聽的方法:
<Button
android:onClick="dailPhone"
android:id="@+id/bt_dail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="撥打此號碼" />
圖1-6所示
在Activity中要編寫點擊事件的方法,代碼如圖1-7所示:
// 在xml中定義button點擊時調(diào)用的方法
public void dailPhone(View view) {
callPhone();
}
圖1-7所示
注意:在第四種方法給相關(guān)按鈕注冊點擊事件時,首先要在XML文件添加該按鈕的onClick屬性并賦值,其次onclick屬性的賦值一定要是activity中的一個方法,再次該方法一定要有一個參數(shù),且該參數(shù)的類型是View,最后保證該方法是一個public類型的。
總結(jié):上述方法各有優(yōu)劣,項目時要根據(jù)具體的情況選擇不同的處理方法。一般有一兩個按鈕的點擊事件時可以選擇第一種方法;四到五個按鈕時選擇第二種方法;十到二十個按鈕時選擇第三種方法,其它情況要選擇第四種方法