教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Android培訓(xùn)之電話撥號(hào)器之點(diǎn)擊事件的優(yōu)化

更新時(shí)間:2016年03月16日16時(shí)53分 來源:傳智播客Android培訓(xùn)學(xué)院 瀏覽次數(shù):

電話撥號(hào)器之點(diǎn)擊事件的優(yōu)化
按鈕的點(diǎn)擊事件有多種寫法,下面就不同的寫法進(jìn)行講解。

編寫內(nèi)部類

在項(xiàng)目中編寫電話撥號(hào)器的點(diǎn)擊事件時(shí),我們是通過新建一個(gè)MyButtonListener的內(nèi)部類來實(shí)現(xiàn)的。如圖1-1是我們的處理方式,這種處理方式有什么弊端呢?假設(shè)我們的界面中有多個(gè)按鈕,這就意味這我們需要寫多個(gè)內(nèi)部類了,很明顯,這種做法是不合理的。
//        找到一個(gè)關(guān)系的按鈕
  Button bt_dail =(Button) findViewById(R.id.bt_dail);
//        給按鈕注冊(cè)一個(gè)點(diǎn)擊事件的監(jiān)聽事件
  bt_dail.setOnClickListener(new MyButtonListener());
圖1-1所示

編寫匿名內(nèi)部類

上述方法是按鈕點(diǎn)擊事件的第一種寫法,當(dāng)界面按鈕很少時(shí)可以使用這種設(shè)計(jì)方式。下面是按鈕點(diǎn)擊事件的第二種寫法,該方法是通過編寫該按鈕的匿名內(nèi)部類來實(shí)現(xiàn)其點(diǎ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, "電話號(hào)碼不能為空", Toast.LENGTH_SHORT).show();
} else {
// 撥打電話,激活系統(tǒng)的撥打電話應(yīng)用,把電話號(hào)碼傳給系統(tǒng)的應(yīng)用。
Intent intent = new Intent();// 新建一個(gè)意圖
intent.setAction(Intent.ACTION_CALL);// 設(shè)置意圖要執(zhí)行的動(dòng)作
intent.setData(Uri.parse("tel:" + number));// 設(shè)置意圖執(zhí)行動(dòng)作的對(duì)象
startActivity(intent);// 開啟這個(gè)意圖
}
}
});
圖1-2所示
圖1-2是直接編寫點(diǎn)擊按鈕的匿名內(nèi)部類,然后實(shí)現(xiàn)該匿名內(nèi)部類的方法來完成點(diǎn)擊事件的響應(yīng)事件。對(duì)于撥打電話這個(gè)響應(yīng)事件,我可以把它封裝成一個(gè)方法。如圖1-3所示,這樣來整個(gè)代碼就顯的更加整潔。
private void callPhone() {
String number = et_phone.getText().toString().trim();
if ("".equals(number)) {
Toast.makeText(MainActivity.this, "電話號(hào)碼不能為空", Toast.LENGTH_SHORT)
.show();
} else {
// 撥打電話,激活系統(tǒng)的撥打電話應(yīng)用,把電話號(hào)碼傳給系統(tǒng)的應(yīng)用。
Intent intent = new Intent();// 新建一個(gè)意圖
intent.setAction(Intent.ACTION_CALL);// 設(shè)置意圖要執(zhí)行的動(dòng)作
intent.setData(Uri.parse("tel:" + number));// 設(shè)置意圖執(zhí)行動(dòng)作的對(duì)象
startActivity(intent);// 開啟這個(gè)意圖
}
}
圖1-3所示

使Activity實(shí)現(xiàn)點(diǎn)擊事件的接口

第二種方法比第一種方法要優(yōu)化很多,但是也存在一些問題。假設(shè)按鈕特別多時(shí),我們就得寫多個(gè)匿名內(nèi)部類。很顯然,這種做法也是不合理的。為此我們可以讓當(dāng)前Activity實(shí)現(xiàn)點(diǎn)擊事件的接口,然后重寫該接口中的方法來處理點(diǎn)擊事件的響應(yīng)。
l Activity如何實(shí)現(xiàn)點(diǎ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 重寫接口中的方法
// 點(diǎn)擊事件的第三中方法
@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.bt_dail:
callPhone();
break;
default:
break;
 }
}
圖1-4所示
在重寫方法中通過判斷點(diǎn)擊按鈕的id來確定點(diǎn)擊的是哪一個(gè)按鈕,從而進(jìn)行不同的事件響應(yīng)。這時(shí)監(jiān)聽事件的添加要按如圖1-5所示來編寫:
Button bt_dail = (Button) findViewById(R.id.bt_dail);
// 給按鈕注冊(cè)一個(gè)點(diǎn)擊事件的監(jiān)聽事件
bt_dail.setOnClickListener(this);
圖1-5所示

xml文件來定義Button的點(diǎn)擊事件

第三種方法要比第二種方法優(yōu)化很多,當(dāng)依舊存在問題。假設(shè)界面中有100個(gè)按鈕這就意味著我們?cè)趕with中做100次判斷,很顯然這種方法是不可取的。為此我們可以在定義xml布局文件時(shí)給相關(guān)的按鈕注冊(cè)監(jiān)聽。如圖1-6為注冊(cè)監(jiān)聽的方法:
   <Button
        android:onClick="dailPhone"
        android:id="@+id/bt_dail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="撥打此號(hào)碼" />
圖1-6所示
在Activity中要編寫點(diǎn)擊事件的方法,代碼如圖1-7所示:
// 在xml中定義button點(diǎn)擊時(shí)調(diào)用的方法
public void dailPhone(View view) {
callPhone();

圖1-7所示
注意:在第四種方法給相關(guān)按鈕注冊(cè)點(diǎn)擊事件時(shí),首先要在XML文件添加該按鈕的onClick屬性并賦值,其次onclick屬性的賦值一定要是activity中的一個(gè)方法,再次該方法一定要有一個(gè)參數(shù),且該參數(shù)的類型是View,最后保證該方法是一個(gè)public類型的。
總結(jié):上述方法各有優(yōu)劣,項(xiàng)目時(shí)要根據(jù)具體的情況選擇不同的處理方法。一般有一兩個(gè)按鈕的點(diǎn)擊事件時(shí)可以選擇第一種方法;四到五個(gè)按鈕時(shí)選擇第二種方法;十到二十個(gè)按鈕時(shí)選擇第三種方法,其它情況要選擇第四種方法

本文版權(quán)歸傳智播客Android培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Android培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/android/
0 分享到:
和我們?cè)诰€交談!