Android开发文档之四种点击事件

此文档适合有一定java基础的人员学习

今天,我们用过一个案例来学习一下点击事件的处理,在这个案例(拨打电话)中,我讲介绍四种点击事件的处理。

在介绍点击事件处理之前,我们需要了解一下需求。首先拨打电话需要一个输入号码的地方,然后就是拨打按钮,界面布局我们可以这样:




其所对用的activity_mian.xml代码如下:

<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" >

    <EditText 
        android:id="@+id/et_phoneNum"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:hint="@string/tips"
        />
    <Button 
        android:id="@+id/bt_call"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/call"
        android:layout_below="@id/et_phoneNum"
        android:layout_alignParentRight="true"
        />

</RelativeLayout>
strings.xml(在项目的res/values下)代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">CallPhone</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="call">拨打电话</string>
    <string name="tips">请输入电话号码</string>

</resources>

好了,布局已经写好,下面我们就开始进行点击事件的处理了


1、 匿名内部类

匿名内部类就是说一个类(一般是接口)在另一个方法内部实现(我的理解,可能不对,请按照课本真实理解)

其代码如下:

package com.hackerant.callphone;

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 Button btCall;
        private EditText etNum;

        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                
                //获取对象
                btCall = (Button) findViewById(R.id.bt_call);
                etNum = (EditText) findViewById(R.id.et_phoneNum);
                //设置点击事件
                //点击事件相应方法一,匿名内部类
                btCall.setOnClickListener(new OnClickListener()
                {
                        
                        @Override
                        public void onClick(View v)
                        {
                                callPhone();
                                
                        }
                });
                
                
                
                
        }

        @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 callPhone()
        {
                String num = etNum.getText().toString().trim();
                
                //如果输入电话号码为空
                if (TextUtils.isEmpty(num))
                {
                        Toast.makeText(getApplicationContext(), "请输入电话号码!", Toast.LENGTH_SHORT).show();
                        return ;
                }
                //Intent三步骤:创建-->设置action-->start
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_CALL);
                intent.setData(Uri.parse("tel:" + num));
                startActivity(intent);
                
        }


}


OKjava代码已经完成,但如果你直接点击运行(Run As Android Application),你将看到如下错误(屏幕+logcat日志):





该错误是因为在Android中拨打电话可能产生费用,故而需要相应的权限,你需要在AndroidManifest.xml中写上拨打电话的权限,代码是:

<uses-permission android:name="android.permission.CALL_PHONE"/>


其位置如下截图:




这时才是真正的完成了,其成功截图如下:



说明:由于我们已将打电话的业务代码给单独写出,所有在后面的事件中,我们只介绍关键代码

 

2、 重写OnClickListener


 其核心代码如下:

@Override
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                
                //获取对象
                btCall = (Button) findViewById(R.id.bt_call);
                etNum = (EditText) findViewById(R.id.et_phoneNum);
                //设置点击事件
                //点击事件相应方法而
                btCall.setOnClickListener(new myOnclickListener());
                
                
                
                
        }
/**
         * 重写OnClickListener方法
         * @author jun
         *
         */
        public class myOnclickListener implements OnClickListener  {

                @Override
                public void onClick(View v)
                {
                        callPhone();
                        
                }
                
        }

其结果参考方法一


3、 让MainActivity继承OnClickListener


其核心代码如下:


package com.hackerant.callphone;

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 implements OnClickListener
{
        private Button btCall;
        private EditText etNum;

        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                
                //获取对象
                btCall = (Button) findViewById(R.id.bt_call);
                etNum = (EditText) findViewById(R.id.et_phoneNum);
                //设置点击事件
                //点击事件相应方法三,该方法需要MainActivity继承OnclickListener,此方法最常用
                btCall.setOnClickListener(this);
                
                
                
                
        }

        
        public void callPhone()
        {
                String num = etNum.getText().toString().trim();
                
                if (TextUtils.isEmpty(num))
                {
                        Toast.makeText(getApplicationContext(), "请输入电话号码!", Toast.LENGTH_SHORT).show();
                        return ;
                }
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_CALL);
                intent.setData(Uri.parse("tel:" + num));
                startActivity(intent);
                
        }

        @Override
        public void onClick(View v)
        {
                switch (v.getId())
                {
                case R.id.bt_call:
                        callPhone();
                        break;

                default:
                        break;
                }
                
        }

}

其结果参考方法一

 

4、在布局文件中写onclick事件

      在activity_main.xml中,改写button代码如下:

<Button 
        android:id="@+id/bt_call"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/call"
        android:layout_below="@id/et_phoneNum"
        android:layout_alignParentRight="true"
        android:onClick="callPhone"
        />


其onClick对应得便点击方法,该方法则不需要重写OnClickListener

 

特别介绍:

Toast.makeText(getApplicationContext(), "请输入电话号码!",Toast.LENGTH_SHORT).show();

 

Toast英文表示祝酒,但在此处表示弹出框,如上面截图中的“请输入电话号码!”便是。在Toast中,一定要有show()方法,因为只有show()才能show出来,否则只是创建一个Toast对象,并没有任何行为。

在makeText中,第一个参数表示上下文,一般我们能用到的是this,getApplicationContext()或**Activity.this,第二个参数是你需要弹出的内容,第三个参数是时长,可以为0 (Toast.LENGTH_SHORT)也可以为1(Toast.LENGTH_LONG)

 

恩,这一篇学习文档就先介绍到这,由于很多原因(主要是我懒)有些知识说的不是很清楚,欢迎前来询问,也希望大神们多多帮助!

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值