17_点击事件第四种写法_布局文件添加onclick属性

尽量不要用第四种点击事件的写法。在一万多行代码中发现了一个没被调用的代码

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>

 


 

posted on 2017-06-09 11:50  绿茵好莱坞  阅读(256)  评论(0编辑  收藏  举报

导航