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);
}
}
}
这种方式虽然也可以给按钮设置点击事件,但不推荐。