1. 程式人生 > >按鈕新增點選事件的多種方式

按鈕新增點選事件的多種方式

1.接著前面的“電話撥號器”案例,先把程式碼優化一下,把撥打電話的程式碼抽取出來

    /**
     * 把撥打電話的業務邏輯抽取出來
     */
    private void callPhone(){
        //先要獲取使用者輸入的電話號碼
        EditText  phone_text = (EditText)findViewById(R.id.phone_text);
        String phone_number = phone_text.getText().toString().trim();

        //判斷輸入的電話號碼不能為空
        if
(phone_number.length() == 0){ Toast.makeText(MainActivity.this, "不能輸入為空", Toast.LENGTH_LONG).show(); }else{ //開始撥打電話 Intent 用來啟動一個Activity //建立一個意圖物件 Intent callIntent = new Intent(); //給這個物件這隻動作 callIntent.setAction(Intent.ACTION_CALL); //設定資料(電話號碼)
callIntent.setData(Uri.parse("tel:" + phone_number)); //撥號 startActivity(callIntent); } }

為按鈕設定點選事件的時候,就可以呼叫這個方法了:

//為按鈕設定點選事件
        bt_call.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                callPhone();
            }
        });

2.建立點選事件的其他方法

上面我們建立按鈕的點選使用是通過給setOnClickListener()傳入一個匿名內部類的形式。
這個匿名類View.OnClickListener其實是一個介面,我們可以自己寫一個類實現這個介面。

    // 我們自己 寫一個OnClickListener的類
    class MyOnclickListener implements View.OnClickListener {
        @Override
        public void onClick(View v){
            //呼叫撥打電話的方法
            callPhone();
        }
    }

然後在setOnClickListener方法中例項化這個類:

bt_call.setOnClickListener(new MyOnclickListener());

測試證明,這樣也是可以的。
自此,我們看一下MainActivity.java檔案所有程式碼:

package com.example.dev.phonecall;

import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); //把一個layout佈局載入給Activity,建立一個聯絡

        /*
        * 通過findViewById方法傳入UI元素的ID找到該元素(撥打電話的button)
        * */
        /*
        返回型別是:View。需要import android.view.View;
        * */
        //View findViewById = findViewById(R.id.bt_call);

        /*
        我們應該把上面找到的按鈕,轉成Button型別
        * */
        //需要import android.widget.Button;
        Button bt_call = (Button)findViewById(R.id.bt_call);

        //為按鈕設定點選事件
//        bt_call.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                callPhone();
//            }
//        });

        bt_call.setOnClickListener(new MyOnclickListener());

    }

    /**
     * 把撥打電話的業務邏輯抽取出來
     */
    private void callPhone(){
        //先要獲取使用者輸入的電話號碼
        EditText  phone_text = (EditText)findViewById(R.id.phone_text);
        String phone_number = phone_text.getText().toString().trim();

        //判斷輸入的電話號碼不能為空
        if(phone_number.length() == 0){
            Toast.makeText(MainActivity.this, "不能輸入為空",
                    Toast.LENGTH_LONG).show();
        }else{
            //開始撥打電話 Intent 用來啟動一個Activity

            //建立一個意圖物件
            Intent callIntent = new Intent();
            //給這個物件這隻動作
            callIntent.setAction(Intent.ACTION_CALL);
            //設定資料(電話號碼)
            callIntent.setData(Uri.parse("tel:" + phone_number));
            //撥號
            startActivity(callIntent);
        }
    }

    // 我們自己 寫一個OnClickListener的類
    class MyOnclickListener implements View.OnClickListener {
        @Override
        public void onClick(View v){
            //呼叫撥打電話的方法
            callPhone();
        }
    }
}

3.如果多個按鈕,前面那種方式是不是最優方法?(推薦)

bt_call.setOnClickListener(new MyOnclickListener());

我們通過傳入一個物件,設定按鈕的點選事件,如果有多個按鈕,那麼是會建立多個物件。

btn1.setOnClickListener(new MyOnclickListener());
btn2.setOnClickListener(new MyOnclickListener());
btn3.setOnClickListener(new MyOnclickListener());

這樣是很佔用記憶體的。
我能否不必每次都new新物件,而是傳入同一個物件呢,類似這樣:

bt_call.setOnClickListener(this);

答案是肯定的。我們讓MainActivity自己來實現OnClickListener介面。

package com.example.dev.phonecall;

import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bt_call = (Button)findViewById(R.id.bt_call);

        //為按鈕設定點選事件
        bt_call.setOnClickListener(this);

    }

    /**
     * 把撥打電話的業務邏輯抽取出來
     */
    private void callPhone(){
        //先要獲取使用者輸入的電話號碼
        EditText  phone_text = (EditText)findViewById(R.id.phone_text);
        String phone_number = phone_text.getText().toString().trim();

        //判斷輸入的電話號碼不能為空
        if(phone_number.length() == 0){
            Toast.makeText(MainActivity.this, "不能輸入為空",
                    Toast.LENGTH_LONG).show();
        }else{
            //開始撥打電話 Intent 用來啟動一個Activity

            //建立一個意圖物件
            Intent callIntent = new Intent();
            //給這個物件這隻動作
            callIntent.setAction(Intent.ACTION_CALL);
            //設定資料(電話號碼)
            callIntent.setData(Uri.parse("tel:" + phone_number));
            //撥號
            startActivity(callIntent);
        }
    }

    // 實現OnClickListener介面中的方法
    @Override
    public void onClick(View v){
        //很顯然,多個按鈕都會呼叫這個方法
        //在這裡可以根據按鈕的ID,處理不同的業務邏輯
        //v.getId() 獲取按鈕的id

        //呼叫撥打電話的方法
        callPhone();
    }
}

4.還有按鈕建立點選事件的方式(不推薦)

修改activity_main.xml 的程式碼:

    <!-- <Button
        android:text=" 撥打此號碼"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="11dp"
        android:id="@+id/bt_call"
        android:layout_below="@+id/phone_text"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" /> -->

     <Button
        android:onClick="callPhoneClick"
        android:text=" 撥打此號碼"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="11dp"
        android:layout_below="@+id/phone_text"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" /> 

然後在MainActivity.java 寫這麼一個方法:

/*
    我們修改了activity_main.xml,給按鈕綁定了這個方法
    * */
    public void callPhoneClick(View view){
        callPhone();
    }

MainActivity.java全部程式碼如下:

package com.example.dev.phonecall;

import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /*
    我們修改了activity_main.xml,給按鈕綁定了這個方法
    * */
    public void callPhoneClick(View view){
        callPhone();
    }

    /**
     * 把撥打電話的業務邏輯抽取出來
     */
    private void callPhone(){
        //先要獲取使用者輸入的電話號碼
        EditText  phone_text = (EditText)findViewById(R.id.phone_text);
        String phone_number = phone_text.getText().toString().trim();

        //判斷輸入的電話號碼不能為空
        if(phone_number.length() == 0){
            Toast.makeText(MainActivity.this, "不能輸入為空",
                    Toast.LENGTH_LONG).show();
        }else{
            //開始撥打電話 Intent 用來啟動一個Activity

            //建立一個意圖物件
            Intent callIntent = new Intent();
            //給這個物件這隻動作
            callIntent.setAction(Intent.ACTION_CALL);
            //設定資料(電話號碼)
            callIntent.setData(Uri.parse("tel:" + phone_number));
            //撥號
            startActivity(callIntent);
        }
    }

}

這種方式雖然也可以給按鈕設定點選事件,但不推薦。