尽量不要用第四种点击事件的写法。在一万多行代码中发现了一个没被调用的代码
public void call(View v){//第四种写法参数一定是View v //public void call(){ //在布局文件中button 声明属性onclick onclick起的名字 对应一个public void方法 //这个方法要在加载button的activity里实现 名字不能错 传入的参数必须View String number = et_number.getText().toString().trim(); if(TextUtils.isEmpty(number)){ Toast.makeText(this, "输入不能为空", Toast.LENGTH_SHORT).show(); }else{ Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+number)); startActivity(intent); } }
想半天咋整。可能是点击事件,然后还要找对应的界面。如果界面又很复杂,那就难找了。
前面三种点击事件的写法都会用到,第四种点击事件的写法就不要用了。自己写demo用第四种没问题,具体跟别人配合开发的时候第四种点击事件的写法就不要用了。
第一种写法再改改,创建一个有名的对象。
package com.itheima.dailer; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.text.TextUtils; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText et_number; //Activity 代表了一个用户的界面. 每一个android的界面都对应一个activity //activity可以创建一个窗口,在这个窗口上加载用户的界面(UI) 这个界面就是用来跟用户交互的 //Activity是安卓中最重要的API, @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //当activity创建的时候就会调用oncreate.在oncreate中做初始化的操作 // 首先调用setContentView()方法 加载界面 加载到内存 展示出来 setContentView(R.layout.activity_main); et_number = (EditText) findViewById(R.id.editText1); Button btn_call = (Button) findViewById(R.id.button1); MyonClickListener listener = new MyonClickListener(); //给按钮添加点击事件 //btn_call.setOnClickListener(new MyonClickListener());//接收一个OnClickListener对象 btn_call.setOnClickListener(listener); } private class MyonClickListener implements OnClickListener { @Override public void onClick(View v) { int id = v.getId(); switch (key) { case value: break; default: break; } // TODO Auto-generated method stub // 当控件被点击的时候就会调用这个onclick方法 // ① 获取用户的输入 String number = et_number.getText().toString(); // ② 判断用户输入是否为空 if(TextUtils.isEmpty(number)){//安卓提供的APITextUtils // 如果为空 提示用户输入内容 //Toast.makeText 向界面输出一个短暂的提示 //第一个参数 上下文Context Activity就是一个上下文 可以传入当前activity对象 //第二个参数 要显示的提示文字 //第三个参数 显示提示的时间长度 Toast.LENGTH_SHORT(显示的时长较短) Toast.LENGTH_LONG(显示的时长较长) //不要忘记要调用show()方法 显示这个Toast Toast.makeText(MainActivity.this, "电话号码不能为空", Toast.LENGTH_SHORT).show();//duration 时长 System.out.println("用户输入是空的"); }else{ //如果不为空 用获取的电话号码 打电话 System.out.println("打电话:"+number); //Intent 意图 就是对要进行的操作的抽象描述 Intent intent = new Intent();//创建一个意图对象 //给意图设置要操作的动作 ACTION_CALL intent.setAction(Intent.ACTION_CALL); //给意图设置要携带的数据 //URL 统一资源定位符 http:// ftp:// https:// abc://(访问不到,压根就没有abc这个协议),必须是已经规范好的协议 //uri 统一资源标示符 url 子类父类的关系 uri比URL多了一个特性 类似于XML和HTML的关系 uri可以自定义协议/自己声明一个协议 Uri data = Uri.parse("tel:"+number);//"tel:"就是咱们自定义的协议 不写tel:不能正确地把电话号码拿到 intent.setData(data); //开启打电话的activity(打电话的界面) startActivity(intent); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
如果有多个按钮需要被点击,那么第一种写法和第三种写法都是可以的。如果是有一个按钮被点击,那么你写匿名内部类也没问题。究竟写哪种,第一种、第二种和第三种就根据自己的习惯来了。有可能很多公司都是习惯第三种写法,让当前的MainActivity来实现对应的点击事件。有的公司可能习惯于第二种写法,觉得更符合面向对象的思路。添加一个点击事件,然后这个点击事件传进一个对象。写switch会被认为是面向过程的思路。当然不同的公司习惯不一样,只要别用第四种写法就行。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:layout_marginTop="14dp" android:hint="在此输入电话" android:ems="10" > <requestFocus /> </EditText> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/editText1" android:layout_below="@+id/editText1" android:layout_marginTop="18dp" android:onClick="call" android:text="拨打此号码" /> </RelativeLayout>
package com.itheima.fourthmathod; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.text.TextUtils; import android.view.Menu; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText et_number; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_number = (EditText) findViewById(R.id.editText1); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } //public void call1(View v){ public void call(View v){//第四种写法参数一定是View v //public void call(){ //在布局文件中button 声明属性onclick onclick起的名字 对应一个public void方法 //这个方法要在加载button的activity里实现 名字不能错 传入的参数必须View String number = et_number.getText().toString().trim(); if(TextUtils.isEmpty(number)){ Toast.makeText(this, "输入不能为空", Toast.LENGTH_SHORT).show(); }else{ Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+number)); startActivity(intent); } } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima.fourthmathod" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.CALL_PHONE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.itheima.fourthmathod.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>