首先看看需要达到的效果:
对应的main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/title" /> <EditText android:id="@+id/number" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" android:layout_below="@id/title" /> <Button android:id="@+id/btn_call" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/number" android:text="@string/callNumber" /> </RelativeLayout>
对于上面这段代码:需要了解相对布局,android:text=需要在哪里配置【alter+1】,为什么需要android:id,一个布局组件相对于另外一个布局组件是总么相对的。android:id="@+id/btn_call中后面的@+i是代表创建一个id的,而android:layout_below="@id/title"这个@id是代表使用一个id。
第一种单击事件:
在main.xml中要这样配置:android:onClick="call",
然后Activity中需要这样实现代码:
public void call(View v){ System.out.println("请拨打电话"); //取出输入框中的号码 EditText etNumber=(EditText) findViewById(R.id.number); String number=etNumber.getText().toString(); //根据号码拨打电话 Intent intent=new Intent(); //创建一个意图 intent.setAction(Intent.ACTION_CALL); //指定要播出的号码 intent.setData(Uri.parse("tel:"+number)); startActivity(intent); //执行这个动作 }
方法里面的代码为拨号器的核心代码。
第二种方法:
这个时候我们将call方法变成私有,private来修饰
/* * 拨打电话的私有方法 */ private void call(){ System.out.println("请拨打电话"); //取出输入框中的号码 EditText etNumber=(EditText) findViewById(R.id.number); String number=etNumber.getText().toString(); //根据号码拨打电话 Intent intent=new Intent(); //创建一个意图 intent.setAction(Intent.ACTION_CALL); //指定要播出的号码 intent.setData(Uri.parse("tel:"+number)); startActivity(intent); //执行这个动作 }
在onCreate方法中内部类来调用:让按钮Button来实现触发调用call方法
/* * 当界面刚创建时回调此方法 * @see android.app.Activity#onCreate(android.os.Bundle) */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //必须执行此句代码,执行父类的初始化方法 setContentView(R.layout.main); //执行当前几面 Button btnCall=(Button) findViewById(R.id.btn_call); btnCall.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub System.out.println("MainActivity2拨打电话"); call(); } });
第三种方法:
/* * 当界面刚创建时回调此方法 * @see android.app.Activity#onCreate(android.os.Bundle) */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //必须执行此句代码,执行父类的初始化方法 setContentView(R.layout.main); //执行当前几面 Button btnCall=(Button) findViewById(R.id.btn_call); btnCall.setOnClickListener(new MyOnClickListener()); } class MyOnClickListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub System.out.println("第三种方式实现"); call(); } }
自己写一个类来实现这个类,这样就可以避免使用内部类。
第四种方法:让Activity实现这个接口OnClickListener
public class MainActivity4 extends Activity implements OnClickListener
在onCreate方法中让Button触发单击事件:
Button btnCall=(Button) findViewById(R.id.btn_call); btnCall.setOnClickListener(this);
实现了OnClickListener借口肯定要实现接口中的方法:
@Override public void onClick(View v) { // TODO Auto-generated method stub System.out.println("第四种单击事件!"); call(); }