电话拨号器

本文详细介绍如何在Android应用中实现从UI设计到逻辑编程的过程,包括控件使用、事件监听、控制台信息打印、Toast提示消息展示及权限请求等功能,并最终实现了拨打电话的应用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在activity中拖入一个textView控件

这里写图片描述

layout_width属性

  • match_parent
    match_parent就是该控件的宽度和父控件一样
    这里写图片描述

  • wrap_content
    wrap_content控件的宽度适配控件的内容
    这里写图片描述

修改text的字体

修改text的字体使用android:textSize属性
这里写图片描述

拖入一个Plain Text和按钮

这里写图片描述

建立位置策略

这里写图片描述

UI效果

这里写图片描述

编辑逻辑代码

  1. 逻辑代码中通过setContentView(R.layout.activity_helloworld);添加View的布局,R.layout.activity_helloworld就是资源目录下面的布局文件。
  2. 为什么逻辑代码就是这个目录呢,主要是因为在manifests文件的package=”com.example.administrator.helloworld”指定的。如果是mainActivity,APP一启动就会执行这个代码逻辑(也就是程序的入口)。

这里写图片描述

根据控件ID找到控件,并且查看控件源代码

  • 查看某个类的源代码只需要在鼠标移到该类上面,然后按住ctrl键,单击鼠标左键即可。
  • 根据ID查找控件,主要是通过函数findViewById实现的,因为每一个控件都有一个独立的ID。
    这里写图片描述

andriod studio快捷键

传送门

给按钮添加事件监听

按钮的事件监听需要实现一个OnClickListener接口类,当然也可以使用匿名内部类来做,这里使用的是普通方法。

package com.example.administrator.helloworld;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class helloworld extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_helloworld);

        ((Button)findViewById(R.id.button2)).setOnClickListener(new buttonClickListener());
    }
    private class buttonClickListener implements View.OnClickListener
    {
        @Override
        public void onClick(View v) {
            EditText textView=findViewById(R.id.editText2);
            Log.v("sss",textView.getText().toString().trim());
        }
    }
}

andriod studio 查看控制台打印信息

控制台打印使用Log.v类,第一个参数是打印的标签,第二个参数是打印的消息。
这里写图片描述

Toast的使用

Toast可以短时间显示一段提醒文字。
第一个参数:传入一个context类,activity继承自context.
第二个参数:需要显示的文字。
第三个参数:显示的时间长短,可选Toast.LENGTH_LONG(长时间)或Toast.LENGTH_SHORT(短时间)

package com.example.administrator.helloworld;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class helloworld extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_helloworld);

        ((Button)findViewById(R.id.button2)).setOnClickListener(new buttonClickListener());
    }
    private class buttonClickListener implements View.OnClickListener
    {
        @Override
        public void onClick(View v) {
            EditText textView=findViewById(R.id.editText2);
            String strNumber=textView.getText().toString().trim();
            if(strNumber.isEmpty())
            {
                Toast.makeText(helloworld.this,"电话号码不能为空",Toast.LENGTH_LONG).show();
                return;
            }
            Log.v("sss",textView.getText().toString().trim());

        }
    }
}

显示效果
这里写图片描述

权限请求

要求API版本最少是23,权限请求是安卓很重要的一个操作,如果没有权限是不能调用拨打电话功能的。
这里写图片描述
需要在AndroidManifest.xml中声明权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.administrator.logincase">
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
  • 检查用户是否具有权限
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;

public class helloworld extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_helloworld);
        /*
         * 检查用户是否有某个权限
         * 如果有权限返回PERMISSION_GRANTED 如果没有权限返回PERMISSION_DENIED
         * */
        if (checkSelfPermission(Manifest.permission.CALL_PHONE) == PERMISSION_GRANTED) {
            ((Button) findViewById(R.id.button2)).setOnClickListener(new buttonClickListener());
            return;
        }
  • 请求权限,并且得到权限授权结果
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;

public class helloworld extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_helloworld);
        /*
         * 检查用户是否有某个权限
         * 如果有权限返回PERMISSION_GRANTED 如果没有权限返回PERMISSION_DENIED
         * */
        if (checkSelfPermission(Manifest.permission.CALL_PHONE) == PERMISSION_GRANTED) {
            ((Button) findViewById(R.id.button2)).setOnClickListener(new buttonClickListener());
            return;
        }
        /*
         * 请求权限
         * 第一个参数是要请求的权限组
         * 第二个参数是一个请求码,自己定义的
         * */
        requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 0x11);
        ((Button) findViewById(R.id.button2)).setOnClickListener(new buttonClickListener());
    }

    /*
     * 请求权限的回调函数
     * 第一个参数返回的是自定义的请求码
     * 第二个参数返回的是请求的权限
     * 第三个参数返回的是请求的结果 PERMISSION_GRANTED PERMISSION_DENIED
     * */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 0x11:
                if(grantResults[0] == )
                break;
            default:
                break;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

Intent动作请求

Intent主要是为了完成某一个动作而声明的,用法是先设置一个动作,然后设置动作所带的数据,之后启动动作。

Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + strNumber));
startActivity(intent);

完成拨打电话功能

完整代码

package com.example.administrator.helloworld;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;

public class helloworld extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_helloworld);
        if (checkSelfPermission(Manifest.permission.CALL_PHONE) == PERMISSION_DENIED) {
            requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 0x11);
        }
        ((Button) findViewById(R.id.button2)).setOnClickListener(new buttonClickListener());
    }

    /*
     * 请求权限的回调函数
     * 第一个参数返回的是自定义的请求码
     * 第二个参数返回的是请求的权限
     * 第三个参数返回的是请求的结果 PERMISSION_GRANTED PERMISSION_DENIED
     * */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 0x11:
                break;
            default:
                break;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    private class buttonClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            EditText textView = findViewById(R.id.editText2);
            String strNumber = textView.getText().toString().trim();
            if (strNumber.isEmpty()) {
                Toast.makeText(helloworld.this, "电话号码不能为空", Toast.LENGTH_LONG).show();
                return;
            }
            if (checkSelfPermission(Manifest.permission.CALL_PHONE) == PERMISSION_DENIED) {
                requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 0x11);
                return;
            }
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:" + strNumber));
            startActivity(intent);

        }
    }
}

效果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值