按鈕新增點選事件的多種方式
阿新 • • 發佈:2019-01-28
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);
}
}
}
這種方式雖然也可以給按鈕設定點選事件,但不推薦。