专栏首页Linux驱动5.Android-电话拨号器详解

5.Android-电话拨号器详解

之前学习了3.Android-ADT之helloworld项目结构介绍后,本章便来写个简单的电话拨号器程序.

实现的步骤如下所示:

  • 1.创建项目
  • 2.写layout/activity_main.xml布局文件(画ui),实现显示效果
  • 3.写MainActivity.java代码,实现具体逻辑功能
  • 4.启动APP看效果

1.创建项目

设置项目名称后,一直点next,直到finish.

创建好的layout/activity_main.xml布局界面如下所示:

对应的布局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_horizontal_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

我们可以看到只要是layout_widthlayout_height属性的值是写的直接值外,其它的全部用的是索引标记的(@XXX/YYYY),这些索引指针地址都会存在R.java中,而对应的索引内容都会存在values/XXXs.xml中(比如@dimen位于dimens.xml,而string位于strings.xml)

以@string/hello_world为例:

在R.java中

在values/strings.xml中

所以TextView控件上则显示hello world!

为什么需要索引,而不是直接写为: android:text="hello world!"

答:为了语言国际化,因为索引指向的值是可以替换的,我们默认使用的都是values/xxx.xml下的索引内容,如果我们设置为English的话,就可以改为values-en/xxx.xml下的英文索引内容(在后面国际化章节学习).

而直接写入的话,则不能实现语言国际化.

分析RelativeLayout之属性值

  • RelativeLayout :表示相对布局的意思,这里表示将当前界面设置为相对布局.
  • android:layout_width和android:layout_height: 设置布局的宽高,对于界面布局而言,这里只能设置为"match_parent"(填满父控件)。
  • android:paddingXXX: 内边框,表示该界面布局内部的控件距离本身边缘有多远
  • tools:context=".MainActivity" : 表示这个xml布局文件关联的是src/MainActivity.java类(用来实现具体逻辑功能)

分析TextView之属性值

TextView用于显示常规文字(不能被修改)的控件

注意: 要想显示控件,必须指定layout_width和layout_height(宽高)

对于控件的宽高设置有三种值可填,如下图所示:

"fill_parent"   //强制让它布满填满父控件的空白

"wrap_content" //设置控件高度刚好能够显示当前内容的大小

"match_parent" //和fill_parent是一个意思,他们的定义本质是一样的,均为-1,只是换了别名,为了命名更准确些, 官方更推荐使用match_parent

2. 写layout/activity_main.xml布局文件(画ui)

最终界面如下图所示:

3.写MainActivity.java代码

在MainActivity.java里主要创建了一个MainActivity类,继承于Activity,如下图所示:

接下来我们便来介绍Activity.

3.1 Activity介绍

一个活动是一个单一的,集中的事情,用户可以做。几乎所有的活动都与用户交互,因此Activity类负责为您创建一个窗口,您可以在其中放置带有setContentView(View)的UI。虽然活动通常作为全屏窗口呈现给用户,但它们也可以以其他方式使用:作为浮动窗口(通过windowisfloat设置的主题)或嵌入到另一个活动中(使用ActivityGroup)。有两个方法,几乎所有子类的活动将实现:

  • onCreate(Bundle) :用于初始化activity的地方,当activity创建的时候会被调用,这里通常使用定义UI的布局资源调用setContentView(int),并使用findViewById(int)检索UI中需要以编程方式交互的小部件。
  • onPause():是处理用户离开活动的地方。最重要的是,此时用户所做的任何更改都应该提交(通常是提交给持有数据的ContentProvider)。

3.2 写MainActivity.java

package com.example.phonecall;
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;

 
//添加继承OnClickListener点击事件类,然后覆写onClick()
public class MainActivity extends Activity  implements OnClickListener {
    private EditText et_number;        //文本框对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); //加载要显示的界面UI
       //1.找到EditText,然后设置按键按下监听
       et_number = (EditText) findViewById(R.id.editText1);
       Button bt_call = (Button) findViewById(R.id.button1);
       bt_call.setOnClickListener(MainActivity.this);  //MainActivity.this表示MainActivity类

    }


    @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;
    }

    @Override
    public void onClick(View v) {
        System.out.println("on click");

        String number = et_number.getText().toString().trim();    //2.获取内容

        if(TextUtils.isEmpty(number)){
        Toast.makeText(MainActivity.this, "内容不能为空", Toast.LENGTH_SHORT).show(); //显示一个提示的浮动显示块

        }else{

            Intent intent = new Intent();
            intent.setAction(intent.ACTION_CALL);      //设置intent要执行的动作, ACTION_CALL表示打电话
            intent.setData(Uri.parse("tel:"+number));  //uri和url类似,但是uri可以自定义多个协议,”tel:“+number表示给number打电话
            startActivity(intent);                     //通过intent(意图)来实现应用间的交互与通讯,从而实现人的意图
        }
    }
}

注意 导入包点击监听事件的包时,选择第二个"android.view.view" :

否则的话,onClick(View v)会变为onClick(DialogInterface dialog,int which)。

3.3 然后添加打电话申请权限(用于是否支持从应用中直接打电话)

在AndroidManifest清单->Permissions里选择Users Permission.

然后添加android.permission.CALL_PHONE

4.然后启动APP

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 15.Android-实现TCP客户端,支持读写

    在上章14.Android-使用sendMessage线程之间通信我们学习了如何在线程之间发送数据.

    张诺谦
  • 8.Android-简单的登录案例编写

    本章来学习登录案例,由于还未学习自定义控件外观,所以ui界面先用最简单的,并保存登录账号密码到data/data/包名/files下

    张诺谦
  • 6.Android-五大布局

    如果要想设置两个控件的比例大小,则设置android:layout_weight(不是android:layout_width),值越大则比例越大(垂直布局则设...

    张诺谦
  • SwipeRefreshLayout下拉刷新组件

    在实际开发中,经常都会遇到下拉刷新、上拉加载更多的情形,这一期就一起来学习Android系统的SwipeRefreshLayout下拉刷新组件。 一、...

    分享达人秀
  • View 源码分析——setContentView

    分析一下 android 中布局的加载流程,每次新建 activity 时都要在 onCreate 中调用 setContentView(R.layout.ac...

    CatEatFish
  • ListView和Adapter(文字列表)

    Adapter是用来帮助填出数据的中间桥梁,简单点说吧:将各种数据以合适的形式显示在View中给用户看。 Adapter有很多的接口、抽象类、子类可以使用。

    李小白是一只喵
  • Android-如何显示版本号并制作3秒跳转页

    大家好,我是 Vic,今天给大家带来Android-如何显示版本号并制作3秒跳转页的概述,希望你们喜欢

    达达前端
  • 重走Android路之挑几个基本控件玩玩(上卷)

    Android为我们提供了很多UI样式,但是在实际开发中,我们往往会根据UI图去为我们选择的绝大部分的控件进行渲染,从而达到产品更加的美观。

    HLQ_Struggle
  • Android WebView实现顶部进度条

    项目中用到WebView加上进度条放在顶部,让用户知道加载进度情况,可以提高用户体验:

    砸漏
  • Android中layer-list基本使用详解

    使用layer-list可以将多个drawable按照顺序层叠在一起显示,默认情况下,所有的item中的drawable都会自动根据它附上view的大小而进行缩...

    砸漏

扫码关注云+社区

领取腾讯云代金券